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

Próbuję uzyskać TOTALNUMBER rekordów w bazie danych, ale baza danych jest uzyskiwanie rozbił spędzaj z java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT * FROM login). Proszę mi pomóc z błędemjava.lang.IllegalStateException: próba ponownego Otwórz już zamknięty obiekt (Tried zamykanie)

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 

Odpowiedz

22

Czy próbowałeś poruszać:

if(cursor != null && !cursor.isClosed()){ 
     cursor.close(); 
    } 

poniżej:

cursor.getCount(); 

tak:

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

I oznacza, że ​​należy zadzwonić GetCount() przed zamknięciem kursor cursor.close(). –

5

java.lang .IllegalS tateException: próba ponownego Otwórz już zamknięte

Twój błąd jest generowany, ponieważ zadzwonić cursor.getCount() na Cursor że jesteś już blisko, a to jest niedozwolone.

Więc albo spróbuj użyć try-w końcu bloku, w którym w końcu zablokować zamknięciu Cursor lub przypisać cursor.getCount() natychmiast int wartość i blisko Cursor.

ale polecam do korzystania z pierwszego podejścia:

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

wiem, że to jest stary, ale mój problem skończył się, że w onCreate() byłem nazywając db.close() po wykonaniu db.execSQL(TABLE_CREATE).

onCreate jest automatycznie wywoływana po dbHelper.getReadableDatabase().

Spowodowało to awarię, ponieważ następnie pobierane były wszystkie wartości z bazy danych z już zamkniętym obiektem. Po usunięciu db.close() z onCreate, wszystko działało.

1

usunąć oświadczenie

+0

Nie zapewnia to odpowiedzi na pytanie. Po uzyskaniu wystarczającego [reputation] (http://stackoverflow.com/help/whats-reputation) będziesz mógł [komentować dowolny wpis] (http://stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/12997199) – StepUp

+1

dziękuję AndroidMechanic, zrobi to –

+0

To rozwiązało mój problem – JasonStack

Powiązane problemy