_public int getRecordsCount() {
String countQuery = "SELECT * FROM " + TABLE_LOGIN;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
if(cursor != null && !cursor.isClosed()){
cursor.close();
}
// return count
return cursor.getCount();
}
_
データベース内のレコードの総数を取得しようとしていますが、データベースは毎回Java.lang.IllegalStateException: attempt to re-open an already-closed object: Android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login)
でクラッシュします。エラーで私を助けてください
_ 03-05 22:23:14.208: E/AndroidRuntime(4988): FATAL EXCEPTION: main
03-05 22:23:14.208: E/AndroidRuntime(4988): Java.lang.IllegalStateException: attempt to re-open an already-closed object: Android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.Java:34)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.Java:64)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.Java:283)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.Java:264)
03-05 22:23:14.208: E/AndroidRuntime(4988): at com.ecomm.Android.sqlite.DatabaseHandler.getRecordsCount(DatabaseHandler.Java:123)
03-05 22:23:14.208: E/AndroidRuntime(4988): at com.ecomm.Android.LaunchActivity.DataBaseImplementation(LaunchActivity.Java:120)
03-05 22:23:14.208: E/AndroidRuntime(4988): at com.ecomm.Android.LaunchActivity.onClick(LaunchActivity.Java:98)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.view.View.performClick(View.Java:2408)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.view.View$PerformClick.run(View.Java:8816)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.os.Handler.handleCallback(Handler.Java:587)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.os.Handler.dispatchMessage(Handler.Java:92)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.os.Looper.loop(Looper.Java:123)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Android.app.ActivityThread.main(ActivityThread.Java:4627)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Java.lang.reflect.Method.invokeNative(Native Method)
03-05 22:23:14.208: E/AndroidRuntime(4988): at Java.lang.reflect.Method.invoke(Method.Java:521)
03-05 22:23:14.208: E/AndroidRuntime(4988): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:876)
03-05 22:23:14.208: E/AndroidRuntime(4988): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:634)
03-05 22:23:14.208: E/AndroidRuntime(4988): at dalvik.system.NativeStart.main(Native Method)
03-05 22:23:15.608: I/binder_sample(4988): [Android.app.IActivityManager,2,1395,com.ecomm.Android,100]
03-05 22:23:15.608: I/binder_sample(4988): Unknown binary event type 110
03-05 22:23:15.608: I/binder_sample(4988): Binary log entry conversion failed
_
カーソルを閉じる前に、getCount()
を呼び出す必要があります。
移動:
if(cursor != null && !cursor.isClosed()){
cursor.close();
}
未満:
cursor.getCount();
このような:
public int getRecordsCount() {
int count = 0;
String countQuery = "SELECT * FROM " + TABLE_LOGIN;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
if(cursor != null && !cursor.isClosed()){
count = cursor.getCount();
cursor.close();
}
return count;
}
Java.lang.IllegalStateException:既に閉じられているものを再度開く
既に閉じているCursor
でcursor.getCount()
を呼び出すため、エラーがスローされますが、これは許可されていません。
したがって、try-finally blockを使用して、最後にCursor
を閉じるか、cursor.getCount()
をint値に割り当ててすぐにCursor
を閉じます。
しかし、最初のアプローチを使用することをお勧めします:
public int getRecordsCount() {
String countQuery = "SELECT * FROM " + TABLE_LOGIN;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = 0;
try {
if (cursor.moveToFirst())) {
count = cursor.getCount();
}
return count;
}
finally {
if (cursor != null) {
cursor.close();
}
}
}
cursor.close()
ステートメントを削除します
私はこれが古いことを知っていますが、私の問題はonCreate()
で、db.close()
を実行した後にdb.execSQL(TABLE_CREATE)
を呼び出していたことになりました。
onCreate
は、dbHelper.getReadableDatabase()
の後に自動的に呼び出されます。
これにより、既に閉じられたオブジェクトを使用してデータベースからすべての値を取得しようとしたため、クラッシュしました。 onCreate
からdb.close()
を削除すると、すべて機能しました。