2010-11-02 178 views
1

我正在建立一個Android應用程序的工作,但我沒有,我的SQL操作正在採取永遠完成Android的SQLite的需要很長時間才能完成

我已經異形應用範圍縮小到行爲將光標移動到結果集的第一行以進行簡單的選擇查詢(只返回1行,我正在測試它以消除結果集的大小作爲一個問題)。

是否有更好的移動選項到結果集的開頭?

編輯:

一些代碼:

public Cursor sqlQuery(String Sql) 
{ 
    Cursor c = database.rawQuery(Sql, null); 
    //start at the first spot 
    c.moveToFirst(); 
    return c; 
} 

和調用代碼

Cursor Slots = evedb.sqlQuery("SELECT attrib.value, " 
      +"attribtypes.attributename " 
      +"FROM dgmTypeAttribs AS attrib " 
      +"INNER JOIN invTypes AS type " 
      +"ON attrib.typeID = type._ID " 
      +"INNER JOIN dgmAttribs AS attribtypes " 
      +"ON attrib.attributeID = attribtypes._ID " 
      +"AND attribtypes.attributename = 'hiSlots' " 
      +"AND type.typeName = '" + shipname + "'"); 

這個運行3次,我有它的時間約2秒的代碼或超過這個在一分鐘內所有的休息。

我也運行了rawQuery語句,但沒有移動到第一個,它需要大約18秒,所以我先看看代碼中最糟糕的部分。

+0

能否請您與我們分享您的代碼,看看您是否做錯了什麼。你有沒有試過在adb的sqlite控制檯上運行查詢? – Pentium10 2010-11-02 12:47:55

+0

看到我的評論下面我已經嘗試了一些移動指針的選項,但是對新創建的光標的特定操作正在將我的加載時間從3個查詢的約2秒鐘加載到一分鐘以上。 – Philderbeast 2010-11-02 13:18:28

+0

代碼添加了更多關於測試已經完成的細節以找到我的問題的來源。 – Philderbeast 2010-11-02 13:31:44

回答

0

你有沒有使用你正在使用的代碼snipet來查看可能出錯?

如果您正在討論移動到遊標中的第一項,我使用:c.moveToFirst()其中c是遊標。

+1

我試過moveToFrist()moveToNext()和moveToPosition(0)但是所有這些都會導致活動花費超過1分鐘來初始化3個查詢 – Philderbeast 2010-11-02 12:41:09

1

您可能擁有大型數據集。你可以做什麼:

  1. 確保你有適當的索引中對使用的每一個領域,或者語法應該被索引(所有的FK字段建立索引中有你爲每個表設置PK你的_ID場?) (一般來說)。

  2. 你應該改一下你的查詢:

    +"ON attrib.attributeID = attribtypes._ID " 
    +"WHERE attribtypes.attributename = 'hiSlots' " 
    +"AND type.typeName = '" + shipname + "'"); 
    
  3. 考慮使用PreparedStatement的

  4. 此查詢使用的數據的檢查量 - 刪除其中的條件,只是把COUNT(*)

  5. 考慮將一個大查詢拆分爲幾個較小的查詢。還有EXPLAIN命令可用於檢查SQLite用來檢索數據的方式。看看here獲取更多信息。

移動到第一行是在查詢開始收集數據,因此這僅僅是數據庫性能問題的地步。

相關問題