相关疑难解决方法(0)

SQLite Android数据库游标窗口分配2048 kb失败

我有一个例程,每秒多次对SQLite数据库运行不同的查询.过了一会儿,我会得到错误

"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = " 出现在LogCat中.

我有应用程序日志内存使用情况,实际上当使用率达到一定限度时,我收到此错误,暗示它用完了.我的直觉告诉我,每次运行查询时数据库引擎都在创建一个新缓冲区(CursorWindow),即使我将.close()标记为游标,垃圾收集器也SQLiteDatabase.releaseMemory()不足以释放内存.我认为解决方案可能在于"强制"数据库始终写入相同的缓冲区,而不是创建新的缓冲区,但我一直无法找到这样做的方法.我已经尝试实例化我自己的CursorWindow,并尝试将其设置为和SQLiteCursor无济于事.

有任何想法吗?

编辑:来自@GrahamBorland的示例代码请求:

public static CursorWindow cursorWindow = new CursorWindow("cursorWindow"); 
public static SQLiteCursor sqlCursor;
public static void getItemsVisibleArea(GeoPoint mapCenter, int latSpan, int lonSpan) {
query = "SELECT * FROM Items"; //would be more complex in real code
sqlCursor = (SQLiteCursor)db.rawQuery(query, null);
sqlCursor.setWindow(cursorWindow);
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望能够.setWindow()在提供新查询之前,CursorWindow每次获取新数据时都将数据放入相同的数据中.

memory sqlite android memory-leaks cursor

69
推荐指数
4
解决办法
5万
查看次数

分配游标时内存不足

我有一个我无法弄清楚的记忆问题.我有一个类来完成我的所有数据库检索工作.我遇到的错误如下:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
Run Code Online (Sandbox Code Playgroud)

执行此操作时发生内存分配错误:

mDatabaseInterface.getGraphForLevel(level);
Run Code Online (Sandbox Code Playgroud)

我知道这是一个泄漏,因为我大约每2.5秒调用一次这种方法,并且5或6个第一次调用很容易通过.现在这里是我的DatabaseInterface类中的方法:

public Graph getGraphForLevel(Level level) {

    //get the nodes
    ArrayList<Node> nodes = new ArrayList<Node>(Arrays.asList(this.getNodesWithLevel(level)));
    //get the edges
    ArrayList<Edge> edges = new ArrayList<Edge>(Arrays.asList(this.getEdgesWithNodes(nodes)));

    return new Graph(nodes, edges);
}

public Node[] getNodesWithLevel(Level level) {

    List<Node> l = new ArrayList<Node>();

    Cursor cursor = mDatabase.query("nodes", null, 
            "level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);

    while (cursor.moveToNext()) {
        l.add(parseNodeFromCursor(cursor));
    }

    cursor.close();

    return l.toArray(new Node[l.size()]); …
Run Code Online (Sandbox Code Playgroud)

memory sqlite android memory-leaks cursor

16
推荐指数
2
解决办法
2万
查看次数

无法分配CursorWindow

我在我的Android应用程序中运行SQLite3数据库.我刚刚从预先填充的数据库中读取了200k行和14列.参赛作品是单词.所有列的数据类型都是文本.查询最多11个字母的单词(例如,ABANDONMENT)工作正常.但对于12或更高(例如,ABANDONMENTS),应用程序崩溃.这是logcat:

Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12.
threadid=11: thread exiting with uncaught exception (group=0x40adf9f0)
FATAL EXCEPTION: Thread-2883
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
at com.example.myapp.MainActivity.query(MainActivity.java:815)
at com.example.myapp.MainActivity$2.run(MainActivity.java:356)
at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)

码:

query = "select * from words where col_1 = \"" + (myWord)+ "\";";
cursor = database.rawQuery(query, null);
if (cursor …
Run Code Online (Sandbox Code Playgroud)

sql database sqlite android cursor

15
推荐指数
3
解决办法
2万
查看次数

Android SQLite CursorWindowAllocationException崩溃

我有一种情况,当我发出一些cursor.moveToNext()请求时我的程序崩溃了.错误消息显示:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=773 (# cursors opened by this proc=773)
at android.database.CursorWindow.<init>(CursorWindow.java:112)
at android.database.CursorWindow.<init>(CursorWindow.java:100)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:364)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:209)
at net.cunniman.teacherplannerlite.SchoolClassDataSource.getClassForDayView(SchoolClassDataSource.java:173)
at net.cunniman.teacherplannerlite.DayView.getSchoolClasses(DayView.java:200)
at net.cunniman.teacherplannerlite.DayView.displayDate(DayView.java:176)
at net.cunniman.teacherplannerlite.DayView.plusDay(DayView.java:287)
at net.cunniman.teacherplannerlite.DayView.onClick(DayView.java:93)
at android.view.View.performClick(View.java:3565)
at android.view.View$PerformClick.run(View.java:14165)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
at dalvik.system.NativeStart.main(Native Method)

try {
this.openForRead();
for (int day_counter = 0; day_counter < DAY_PERIOD.length/2; day_counter++) …
Run Code Online (Sandbox Code Playgroud)

android cursor

4
推荐指数
1
解决办法
6632
查看次数

标签 统计

android ×4

cursor ×4

sqlite ×3

memory ×2

memory-leaks ×2

database ×1

sql ×1