2013-03-11 7 views
11
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(); 
    } 

私は、データベース内のレコードのTOTALNUMBERを取得しようとしていますが、データベースがjava.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login)と毎回クラッシュしてきています。エラーjava.lang.IllegalStateException:しようと再オープンに既に閉じたオブジェクト(しようとしましたクロージング)

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 

答えて

22

で私を助けてください、あなたが移動しようとしたことがあり:

以下
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; 
} 
+0

を削除します。 –

5

れるjava.lang .IllegalS tateException:あなたがそのあなたすでに近いとこれが許可されていないCursorcursor.getCount()を呼び出すために再オープンする試みは既に閉じ

あなたのエラーがスローされます。

だから、どちらかのtry-最終的には最終的にあなたがあなたのCursorを閉じるか、すぐに値と近いCursorをintにcursor.getCount()を割り当てるブロックブロックを使用してみてください。私はこれが古いですけど、私の問題はonCreate()で、私はdb.execSQL(TABLE_CREATE)を実行した後db.close()を呼んでいたことになってしまっ

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(); 
     } 
    } 
} 
0

しかし、私はあなたにお勧めは、最初のアプローチを使用しています。

onCreateは、dbHelper.getReadableDatabase()の後に自動的に呼び出されます。

これはクラッシュしました。これは、閉じられたオブジェクトを持つデータベースからすべての値を取得するためです。 db.close()onCreateから削除すると、すべて機能しました。

1

私はあなたがあなたのカーソルをクローズする前に、あなたが同様にgetCount()を呼び出す必要があることを意味cursor.close()声明

+0

これは質問に対する答えを提供しません。十分な[評判](http://stackoverflow.com/help/whats-reputation)があれば、[任意の投稿にコメントする]ことができます(http://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの説明を必要としない回答を提供する](http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](レビュー/低品質の投稿/ 12997199) – StepUp

+1

AndroidMechanicに感謝、 –

+0

これは私の問題を解決しました – JasonStack

関連する問題