![](/img/trans.png)
[英]Android SQLite Cursor out of bounds exception on SELECT count(*) FROM table
[英]Android sqlite cursor - out of memory
我正在尝试调试遇到的“内存不足”错误,因此为了简化示例以寻求帮助,我有一个按钮,单击该按钮可查询数据库并将所有值返回到ArrayList中。 ,然后使用ArrayList填充RecyclerView。 这是成功的,但是如果我第二次按下按钮,则会发生“内存不足”错误。 该查询返回了大量数据,从日志中我可以看到仅按一下按钮就没有太多可用的内存(在仿真器上运行)。 我从日志中的这一行得出了这个结论:
com.wizzkidd.myapp D/dalvikvm: GC_FOR_ALLOC freed 1459K, 2% free 91444K/93016K, paused 40ms, total 40ms
并且,如前所述,再次按下该按钮将出现此错误:
com.wizzkidd.myapp E/dalvikvm-heap: Out of memory on a 152-byte allocation.
错误指向我的数据库帮助程序类,更具体地说,此代码段:
public List<MyInfo> getAllFromDb() {
List<MyInfo> myArrayList= new ArrayList<MyInfo>();
String selectQuery = "SELECT * FROM myTable";
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);
try {
if (cursor.moveToFirst()) {
do {
MyInfo myInfo = new MyInfo();
myInfo.setTitle(cursor.getString(0));
myInfo.setDescription(cursor.getString(1));
myArrayList.add(myInfo);
} while (cursor.moveToNext());
}
} catch (Exception e) {
Log.d(TAG, "Error while trying to get data from database");
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
return tvGuideInfoList;
}
我在这里研究过SO上的前几篇文章,大多数答案都说游标必须在finally块中关闭。 但是正如您在上面看到的,我已经在这样做了。
@antlersoft向我指出了正确的方向,因为我需要清除/清空适配器中用于填充RecyclerView的数据。
我想出了一种快速的方法,它允许我为MyViewAdapter创建一个空白的ArrayList,然后将其用于RecyclerView。 我相信,通过用空白的ArrayList填充适配器,它迫使垃圾收集清理先前的数据,从而使我可以为下一次填充准备好一个新的内存池。
private void clearRecyclerView() {
myViewAdapter = new MyViewAdapter(activity, new ArrayList());
myRecyclerView.setAdapter(myViewAdapter);
myViewAdapter.notifyDataSetChanged();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.