2016-06-01 76 views
0

我正在尋找一些日子一個解決方案,我的問題與SQLite和Android。我閱讀了很多關於sqlite和android的文章。我看到有人說你需要密切的CURSOR,而其他人則說你需要密切的數據庫,以及其他需要密切關注的人,以及其他你不需要關閉的人,因爲一個Android工程職位。Android需要關閉遊標,數據庫,兩者還是沒有?

在我的應用程序中,我們有太多的使用sqlite。

1 - 我們存儲要同步的內容。 2 - 我們在後臺添加/刪除東西。 3 - 我們有+/- 10個後臺服務,由Alarm Manager啓動以同步某些事物。

一切運行在同一時間,多個線程和更多。

當我得到的應用程序,我們有很多,很多和崩潰關閉遊標/數據庫,同時打開其他光標很多。很混亂。因此,閱讀後,谷歌工程師職位(我不記得谷歌組),一個答案,你不需要關閉sqlite光標或數據庫(我不記得,我不知道如果有所作爲)。

所以現在在同步的東西我的後臺服務,我得到它的錯誤:

Fatal Exception: android.database.CursorWindowAllocationException 
Cursor window allocation of 2048 kb failed. # Open Cursors=593 (# cursors opened by this proc=593) 

所以我需要做什麼?什麼是正確的方法?什麼會與很多使用它的線程和IntentServices一起工作?

我的示例代碼今天:

public static MyInternalObject getFirstAudience() { 
    SQLiteDatabase db = UbookProvider.getInstance().getReadableDatabase(); 
    String sql = "SELECT * FROM " + UbookContract.MyInternalObject.TABLE_NAME + " LIMIT 1"; 
    Cursor cursor = db.rawQuery(sql, null); 

    if (cursor != null) { 
     if (cursor.getCount() > 0) { 
      cursor.moveToFirst(); 
      do { 
       return MyInternalObjectService.createFromCursor(cursor); 
      } while (cursor.moveToNext()); 
     } 
    } 

    return null; 
} 

IM在黑暗中,我不知道一個體面的方式來做到這一點,以解決我的問題,在Android的數據庫。

任何人都可以幫到我嗎?

我的github(github.com/prsolucoes)也有很多開源項目。我爲社區做了很多事情,但今天是我需要的。

+1

需要關閉遊標,數據庫是不必要的。 –

+0

但是,如果你直接執行數據庫,像這樣: 'String sql =「DELETE FROM」+ UbookContract.MyTable.TABLE_NAME; SQLiteDatabase db = UbookProvider.getInstance()。getWritableDatabase(); db.execSQL(sql); ' 你需要密切的東西嗎? –

+0

我不認爲在刪除操作後您需要關閉任何東西。 –

回答

2

是的,你需要關閉你的遊標。一種方法是將所有查詢包裝在try/finally語句中。

Cursor c = null; 
try { 
    c = db.query(...) 
} finally { 
    if (c != null) { 
     c.close(); 
    } 
} 

如果您正在使用CursorLoaders(我強烈推薦),那麼你並不需要關閉遊標,因爲裝載機框架管理它。

+0

但是,如果你直接執行數據庫,像這樣: 'String sql =「DELETE FROM」+ UbookContract.MyTable.TABLE_NAME; SQLiteDatabase db = UbookProvider.getInstance()。getWritableDatabase(); db。execSQL(SQL); ' 你需要密切的東西嗎? –

+1

不,如果你正在做一個創建/插入/更新/刪除,你不需要關閉任何東西。 SQLiteDatabase類有一些幫助刪除/更新/等,我建議你使用這些,而不是寫入原始SQL。例如,db.delete(table,where,whereargs)爲您執行參數綁定,並返回受影響的行數。 – chessdork