我正在Android 4.0+上测试一款应用,效果很好。在2.2 / 2.3上,我一直遇到SQLlite
游标的问题。奇怪的是,如果这种情况发生在应用程序启动时的90%。我无法解释为什么它有时会起作用。
以下是部分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
以下是问题发生的地方:
在Splash Screen中,我从MySQL获取值并将它们放在两个不同的SQLlite表中。我可以验证表中是否填充了数据。启动画面退出。
下一个Activity获取两个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);
答案 0 :(得分:1)
cursor.close();
在您返回之前,必须手动关闭游标。
答案 1 :(得分:0)
在定义光标后调用它:
startManagingCursor(Cursor);
这告诉活动根据活动的生命周期开始管理光标的生命