2013-05-01 24 views
0

我正在测试Android 4.0+上的应用程序,它效果很好。在2.2/2.3上,我一直有SQLlite游标问题。奇怪的是,如果这发生像应用程序启动时的90%。我无法解释为什么它有时会起作用。不关闭游标 - 仅在Android 4.0之前?

下面是部分LogCat

05-01 20:02:30.341: E/Cursor(369): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.---.---/databases/cats.db, table = trending_watching, query = SELECT _id, item_id, item, review, review_id, cat, user, url FROM trending_watching 
05-01 20:02:30.341: E/Cursor(369): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 

这里是哪里的问题发生:

在闪屏,我抢从MySQL值,并把他们在两个不同的SQLlite表。我可以验证表中正在填充数据。启动画面退出。

下一个活动需要两个SQLLite表,并得到这样的数据:

// Open Database 

watchItemIdList = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_ITEM_ID); 
watchUsers = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_USER); 
watchCats = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_CAT); 
watchReviews = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_REVIEW); 
watchReviewId = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_REVIEW_ID); 
watchItems = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_ITEM); 
watchUrl = datasource 
     .getWatchStrings(MySQLiteHelper.COLUMN_TREND_WATCH_URL); 

    // Close database 

在这里得到数据:

public List<String> getWatchStrings(String dbColumn) { 

    Cursor cursor = database.query(MySQLiteHelper.TABLE_WATCHING_REVIEWS, 
      allTrendWatchingColumns, null, null, null, null, null); 

    List<String> array = new ArrayList<String>(); 
    while (cursor.moveToNext()) { 
     String uname = cursor.getString(cursor.getColumnIndex(dbColumn)); 
     array.add(uname); 
    } 
    return array; 

} 

的应用不断崩溃,我从LogCat上相信此行:

Cursor cursor = database.query(MySQLiteHelper.TABLE_WATCHING_REVIEWS, 
      allTrendWatchingColumns, null, null, null, null, null); 

回答

1
cursor.close(); 

之前您返回游标的生命,光标必须手动关闭。

+0

并确保在'finally'块中调用'cursor.close()',以确保始终调用它。 – 2013-05-01 20:47:52

+0

谢谢!标记正确。 – KickingLettuce 2013-05-01 21:14:07

0

在定义光标后调用此函数:

startManagingCursor(Cursor); 

这告诉活动开始管理基于活动的生命周期

+0

我看到这是弃用?有没有更好的办法?如不在主UI线程上执行这些类型的函数? – KickingLettuce 2013-05-01 20:44:32