2016-06-01 44 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

相关问题