2017-03-27 3 views
0

私はAndroidのネイティブモバイルアプリケーションを構築しており、アプリケーションでユーザー入力を使ってテーブルを動的に作成する必要があります。ドキュメントを読むことによって、SQLiteOpenHelperを使用できないようです。テーブルはコンストラクタでのみ作成する必要があるか、onCteate()メソッドで作成する必要があるためです。だから私は自分のユーティリティクラスをSQLiteDatabaseで初期化しました。この例では、データベースとテーブルを作成しました。私は、DB内のテーブルを照会するとき、私はSQLiteOpenHelperクラスを拡張することなく、適切にSQLiteデータベースを開閉する方法java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabaseAndroid SQlite - ダイナミックテーブルを使って作業する

を示すエラーを得ました。私は、データの必要性に応じて異なる活動からのデータを照会する必要があります。私の必要性に合ったチュートリアルはありますか?テーブルを作成するには、データベース

public static SQLiteDatabase phiDatebase; 

public void createOrOpenDatabase(String dbNmae, Context context){ 
     this.dbName = dbNmae; 
     try{ 
      uuiDatebase = context.openOrCreateDatabase(dbNmae, Context.MODE_PRIVATE, null); 
      Log.i("UUI_LOG","DB CREATED"); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

を作成するには

public void createSurveyTable(String tableName, String queryString){ 
    try{ 

     uuiDatebase.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + queryString + ");"); 
     Log.i("UUI_LOG", "TABLE CREATED"); 

    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 

} 

しかし、私はテーブルの一覧を照会するとき、私はエラーを取得しています。

Cursor res = uuiDatebase.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); 
res.moveToFirst(); 

以下、私の完全なクラスであるCraete DB、テーブルの作成、およびテーブルのリストの取得です。

public class UUIDBHelper { 

    public static SQLiteDatabase uuiDatebase; 
    public static String dbName = ""; 


    public void createOrOpenDatabase(String dbNmae, Context context){ 
     this.dbName = dbNmae; 
     try{ 
      uuiDatebase = context.openOrCreateDatabase(dbNmae, Context.MODE_PRIVATE, null); 
      Log.i("PHI_LOG","DB CREATED"); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    public void createSurveyTable(String tableName, String queryString , boolean isCreate){ 
     try{ 
      if(isCreate) { 
       uuiDatebase.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + "(" + queryString + ");"); 
       Log.i("PHI_LOG", "TABLE CREATED"); 
      } 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 

    } 

    public Cursor getAllTables() { 

     //SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = uuiDatebase.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null); 
     res.moveToFirst(); 

     return res; 
    } 

    public Cursor getSurveyNames(String tableName) { 

     //SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor res = uuiDatebase.rawQuery("SELECT survey_name FROM "+tableName+" WHERE id=0", null); 
     res.moveToFirst(); 

     return res; 
    } 


} 

ここLogcat結果

03-28 13:28:12.922: E/SQLiteDatabase(2837): **android.database.sqlite.SQLiteDatabaseLockedException: database is locked** (code 5): , while compiling: PRAGMA journal_mode 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:634) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:320) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:294) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1142) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:1131) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:261) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at surveytool.uui.com.uuisurveytool.UUIDBHelper.createOrOpenDatabase(UUIDBHelper.java:24) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at surveytool.uui.com.uuisurveytool.ListCreatedSurvey.onResume(ListCreatedSurvey.java:54) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1241) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.Activity.performResume(Activity.java:6023) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2940) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2982) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1322) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.os.Handler.dispatchMessage(Handler.java:102) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.os.Looper.loop(Looper.java:135) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at android.app.ActivityThread.main(ActivityThread.java:5221) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at java.lang.reflect.Method.invoke(Native Method) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at java.lang.reflect.Method.invoke(Method.java:372) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
03-28 13:28:12.922: E/SQLiteDatabase(2837):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

コードに問題があります。あなたは秘密にしています。 [mcve]を提供してください。 –

+0

logcatエラーを共有できますか? – devcelebi

+0

フルクラスの拡張sqliteHelperを提供してください。それは、原因がどこにあるのかを理解するための考えを私たちに与えるかもしれません。 –

答えて

0

SQLiteの操作がSQLiteOpenHelperのclasssを使用せずに行われた場合、基本的に、DBを開いて手動で閉鎖する必要があります。

トランザクションが完了すると閉じます。

dbInstance .close();