2013-08-02 3 views
0

У меня проблема, когда я использую Sqlite android. Бревно показать мне, что:SQLiteDatabase android IllegalStateException

SQLiteConnectionPool(1730): **The connection pool for /data/data/dev.xx.xx/databases/XX has been closed but there are still 1 connections in use. They will be closed as they are released back to the pool.** 
08-02 14:15:41.490: D/AndroidRuntime(1730): Shutting down VM 
08-02 14:15:41.490: W/dalvikvm(1730): threadid=1: thread exiting with uncaught exception (group=0xb4d74908) 
08-02 14:15:41.510: E/AndroidRuntime(1730): FATAL EXCEPTION: main 
08-02 14:15:41.510: E/AndroidRuntime(1730): **java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/dev.xx.xx/databases/XX** 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:520) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:263) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at dev.xx.xx.SettingActivity$3.onClick(SettingActivity.java:205) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.os.Looper.loop(Looper.java:137) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-02 14:15:41.510: E/AndroidRuntime(1730):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 

Эта ошибка наступит тогда, когда я пытаюсь позвонить:

public class DataBase extends SQLiteOpenHelper { 

... 
    void addUser(String who, String time, String table, String phone) { 
      SQLiteDatabase db = this.getWritableDatabase(); 
      ContentValues values = new ContentValues(); 
      values.put(KEY_NAME, who); 
      values.put(KEY_PHONE, phone); 
      values.put(KEY_TABLE_RES, table); 
      values.put(KEY_TIME, time); 
      db.insert(TABLE_RESERVATION, null, values); 
      db.close(); // Closing database connection 
     } 

.... 
} 

я, что это когда вызов функ что:

this.getWritableDatabase()

+0

где находится этот код? – btse

+0

Можете ли вы опубликовать, как вы называете 'addUser'. Проверьте, закрыты ли вы до вызова addUser, поскольку logcat говорит, что пытается повторно открыть уже закрытый объект – Raghunandan

+0

. Я вызываю так: \t 'DataBase db = new DataBase (контекст); \t \t \t \t \t db.addUser (userName.getText(). ToString(), table.getText(). ToString(), \t \t \t \t \t \t \t date.getText(). ToString() + "" + time.getText(). toString(), phon.getText(). toString()); ' – Armanoide

ответ

2

Я не верю, что вы должны получать новый экземпляр SQLiteDatabase, такой как каждый время. Вы хотите сохранить ссылку на объект SQLiteDatabase в своем SQLiteOpenHelper. Ваш SQLiteOpenHelper должен быть построен примерно так:

public class DataBase extends SQLiteOpenHelper { 

... 
    private SQLiteDatabase mDatabase; 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     ... 
     mDatabase = db; 
     ... 
    } 

    void addUser(String who, String time, String table, String phone) { 
     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, who); 
     values.put(KEY_PHONE, phone); 
     values.put(KEY_TABLE_RES, table); 
     values.put(KEY_TIME, time); 
     mDatabase.insert(TABLE_RESERVATION, null, values); 
    } 

.... 
} 
+0

Всегда такая же ошибка. – Armanoide

+1

Я добавил: 'публичного статическое DataBase деЫпзЬапс (Context CTX) { \t \t \t \t если (mDatabase == NULL) { \t \t \t mDatabase = новый DataBase (ctx.getApplicationContext()); \t \t \t db = mDatabase.getWritableDatabase(); \t \t} \t \t возвращение mDatabase; \t} ' – Armanoide

Смежные вопросы