2016-08-19 98 views
0

首先,我的遊戲是在Unity3D中使用一個sqlite數據庫。搜索數據表與搜索List <>

其次,我的數據庫是用來存儲數千隨機恆星系統和其附帶的數據(行星,恆星,位置等等等等)

我想要的球員能夠做的就是在鍵入系統「地址」(例如,如果有5個星系統在礦井DB;

Sys001 
Sys0012 
Sys0013 
Sys004 
Sys050 

和用戶搜索001,那麼搜索結果將返回;

Sys001, Sys0012, Sys0013 

忽略Sys004和Sys050。

這會立即發生/接近即刻(非常快),所以如果用戶添加另一個字符(IE搜索0013),那麼結果將立即實時更新。

我的問題是....要實現這一點,哪個會更好用?我應該堅持只使用我的數據庫(IE使用SQL函數來獲取這些數據),還是更快/更好/更容易/更理想的將所有數據庫數據導入到列表中,然後搜索列表(即List [i])。 nameVariable.Contains(「001」)等)

+1

不,讓數據庫執行搜索。它針對這些任務進行了優化,並具有適當的數據結構。當然,你應該幫助數據庫併爲相應字段指定一個索引。 –

+0

我也這麼想。我會想象它也更安全? 你是指什麼索引?如在主鍵? 編輯:另外,稍微偏離主題 - 是否更好地關閉數據庫連接,一旦我完成它,然後重新打開時,它再次需要 - 或者它是一個想法,保持連接打開,如果它肯定會在不久的將來再次使用? – NeoKuro

回答

1

如果它被訪問了很多並經常使用,那麼是的,你可以將它加載到一個集合的內存中並使用它。如果沒有,請在地址上創建索引並在列上進行搜索。同樣,如果經常訪問數據庫,則在遊戲開始時打開連接,重新使用該連接並在結束時關閉連接。如果沒有,請打開它並在使用後關閉它們,以便訪問它 - 這只是有助於釋放資源。

+0

好的謝謝。另一個問題是,是否有辦法「扼殺」結果?如果我同時加載所有的結果(儘管IE; while(_reader.Read()){//將結果添加到列表中} 然後有相當多的滯後量(遊戲凍結2-3秒) 。我原來的解決方案是使用協同程序 - 它工作。但是,當我試圖從另一個Clalss(通過對行爲/腳本的靜態引用)運行'選擇'功能時,我總是收到nullReferenceException與coRoutines :( – NeoKuro

+0

對不起,不確定的SQLite實現細節,但可以提供一些想法來測試:通常過程中最昂貴的部分是打開連接,所以找出瓶頸是什麼。如果查詢,然後看如果有更好的方法可以使用,那麼你不需要通過reader.read()循環,而且創建一個容量更大的list/array:var list = new List (100);所以在內部完成的調整就不那麼重要了。 – Chev

+0

嗯謝謝我會給它一個鏡頭 - 我從來沒有真正注意過代碼優化,更不用說數據庫優化了,但我現在可以從現在開始哈哈。我確實設法解決了我的問題,我把while(reader.Read())放入一個coRoutine中,每增加10個條目就會暫停一次。它適用於約100個條目,但是當我來到最終產品時,會有成千上萬的,所以我們會看到它是否是固定的哈哈 – NeoKuro