web-dev-qa-db-ja.com

カーソル移動時のandroid.database.CursorWindowAllocationException

私はSQLiteデータベースを使用していますが、オリジンが見つからないランタイムエラーが定期的に発生します。クエリの後、moveToFirstを使用して、取得された最初のレコードをポイントします。これにより、Android.database.CursorWindowAllocationException例外がトリガーされることがあります。この例外に追加されるのは、次の文です:「2048kbのカーソルウィンドウの割り当てに失敗しました。#open Cursors = 736(#cursors opendby this proc = 736)」。

Androidのドキュメントでは、この例外に関連するものはまだ見つかりません。その原因と回避方法を知っている人はいますか?

15
Zelig63

このエラーは、ほとんどの場合、終了時にカーソルを閉じないことが原因です。カーソルを開くたびに、カーソルが表すデータをマップするためのメモリが必要であり、カーソルを閉じるまでそのメモリを解放することはできません。この目的で使用できるメモリの量には制限があるため、カーソルが閉じられておらず、アプリケーションが新しいカーソルを開き続ける場合、このエラーはある時点で発生する可能性があります。

コードを調べて、作成されたすべてのカーソルがある時点で閉じられていることを確認することをお勧めします。また、ループ内でカーソルを開くコードにも注意してください。エラーメッセージには「openCursors = 736」と表示されます。これは、ある種のループ内でのカーソルアクティビティが多いことを示しています。

32
NigelK