2012-03-14 18 views
1

sqlite関連のカーソルでこのエラーが発生しました。私はSQLiteOpenHelperをサブクラス化してデータベースにアクセスします。その後、DBにアクセスしてカーソルを直後に閉じます。それにもかかわらず、これは私が活動をクローズエラーが発生:androidと/ sqlite:カーソルで問題が発生する

コードは次のようになります。

String sql = "SELECT * FROM table_bla LIMIT 1"; 
Cursor cursor = dbHelper.getWritableDatabase().rawQuery(sql, null); 

cursor.moveToFirst(); 
String x = cursor.getString(cursor.getColumnIndex("x")); 
cursor.close(); 

そして、私はこれを取得:

03-14 15:34:55.945: E/Database(3825): close() was never explicitly called on database '/data/data/my.project/databases/myDB.db' 
03-14 15:34:55.945: E/Database(3825): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847) 
03-14 15:34:55.945: E/Database(3825): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:572) 
03-14 15:34:55.945: E/Database(3825): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 
03-14 15:34:55.945: E/Database(3825): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118) 
03-14 15:34:55.945: E/Database(3825): at my.project.StartScreen.onResume(StartScreen.java:35) 
03-14 15:34:55.945: E/Database(3825): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
03-14 15:34:55.945: E/Database(3825): at android.app.Activity.performResume(Activity.java:3832) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2231) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2256) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1789) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
03-14 15:34:55.945: E/Database(3825): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-14 15:34:55.945: E/Database(3825): at android.os.Looper.loop(Looper.java:130) 
03-14 15:34:55.945: E/Database(3825): at android.app.ActivityThread.main(ActivityThread.java:3835) 
03-14 15:34:55.945: E/Database(3825): at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 15:34:55.945: E/Database(3825): at java.lang.reflect.Method.invoke(Method.java:507) 
03-14 15:34:55.945: E/Database(3825): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
03-14 15:34:55.945: E/Database(3825): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
03-14 15:34:55.945: E/Database(3825): at dalvik.system.NativeStart.main(Native Method) 

誰もがこれを原因知っていますか?

+1

データベースオブジェクトをクローズしましたか? –

答えて

2
は、そのようなあなたのコードを書き換え

String sql = "SELECT * FROM table_bla LIMIT 1"; 
SQLiteDatabase database = dbHelper.getWritableDatabase(); 
Cursor cursor = database.rawQuery(sql, null); 

cursor.moveToFirst(); 
String x = cursor.getString(cursor.getColumnIndex("x")); 
cursor.close(); 
database.close(); 

は、そうしないと、問題が発生します決して近いデータベースへの接続を取得します。

+0

さらに、DBに変更を加えていないので、書き込み可能なデータベースではなく読み込み可能なデータベースを取得する必要があります。 – dymmeh

+0

は本当に重要ではありません。可能ならば 'getReadableDatabase()'は書き込み可能です。編集:うまくいけば、dbを取得するのが難しくなるので、読み取り可能なdbを要求する方が安全です。 – zapl

2

これは、アプリケーションを終了する前にDBへのアクセスを閉じる必要があるためです。私はこのコードが強制終了しないと考えています。

関連する問題