前提・実現したいこと
どこにどのテーブルを作ればいいのかも皆目見当がつかない状態ですが、ItemAとBの情報を保存した同一データベースの異なるテーブルから情報を取り出し、リストにまとめたいです。(そもそも同一テーブルである必要性?)
ItemA、ItemBそれぞれのカスタムSQLiteOpenHelperクラスを作成した上で、それらを基にcursorを生成、データを取り出すgenerateDatabasedListメソッドを実装。
adaptListViewメソッドの中でそれをItemA,Bにそれぞれ別に行います。
発生している問題・エラーメッセージ
下記の通り、ItemAのほうは問題なく終わるのですが、ItemBの方がなぜかデータベースを見つけられず止まってしまいます。
ItemA,BのSQLiteOpenHelperは両方ともデータベースITEM_DATABASEを参照するItemSQLiteOpenHelperを継承しており、その中にItemAとItemBのテーブルを作っている状態です。
何度かexecSQLの中で文法ミス(例えば"CREATE TABLE "としなければいけない所を"CREATE TABLE"(スペースなし)とした)をしたまま実行していて、それがネックになっているのかと思いデータベースに関する情報を調べましたが訳がわからず困っています。
//Log 09-06 18:23:03.345 ~/com.example.hoge.piyopiyoproject V/MainActivity: ITEM_A_TABLE cursor generated 09-06 18:23:03.371 ~/com.example.hoge.piyopiyoproject V/MainActivity: Succeeded in close the database and cursor. 09-06 18:23:03.379 ~/com.example.hoge.piyopiyoproject V/MainActivity: ITEM_B_TABLE cursor generating //Logここまで 09-06 18:23:03.382 ~/com.example.hoge.piyopiyoproject E/SQLiteLog: (1) no such table: ITEM_B_TABLE 09-06 18:23:03.384 ~/com.example.hoge.piyopiyoproject D/AndroidRuntime: Shutting down VM 09-06 18:23:03.406 ~/com.example.hoge.piyopiyoproject E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.hoge.piyopiyoproject, PID:~ java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hoge.piyopiyoproject/com.example.hoge.piyopiyoproject.MainActivity}: android.database.sqlite.SQLiteException: no such table: ITEM_B_TABLE (code 1): , while compiling: SELECT * FROM ITEM_B_TABLE ... at com.example.hoge.piyopiyoproject.MainActivity.generateDatabasedList(MainActivity.java:149)
該当のソースコード
Java
1//MainActivity 2public final void adaptListView() { 3 List itemList = new ArrayList(); 4//データベースからitemA,itemBを取り出す 5//試したこと1 6 List itemAList = this.generateDatabasedList(new ItemASQLiteOpenHelper(this)); 7 List itemBList = this.generateDatabasedList(new ItemBSQLiteOpenHelper(this)); 8//itemListに両方を追加 9 itemHolderList.addAll(itemAHolderList); 10 itemHolderList.addAll(itemBHolderList); 11 12 ...
Java
1//MainActivity 2public final List generateDatabasedList(ItemSQLiteOpenHelper itemSQLiteOpenHelper) { 3 List list = new ArrayList(); 4//引数のitemSQLiteOpenHelperがitemAなのかBなのかでキャスト 5 if (itemSQLiteOpenHelper instanceof ItemASQLiteOpenHelper) { 6 itemSQLiteOpenHelper=(ItemASQLiteOpenHelper)itemSQLiteOpenHelper; 7 } 8 else if (itemSQLiteOpenHelper instanceof ItemBSQLiteOpenHelper) { 9 itemSQLiteOpenHelper=(ItemBSQLiteOpenHelper)itemSQLiteOpenHelper; 10 } else { 11 throw new Exception("Wrong databaseOpenHelper assigned at MainActivity.generateDatabasedList()"); 12 } 13 14 SQLiteDatabase database = itemSQLiteOpenHelper.getReadableDatabase(); 15//Log出力 16 Log.v("MainActivity", itemSQLiteOpenHelper.getTABLE_NAME()+" cursor generating"); 17//cursor取得 18 Cursor cursor = database.query(itemSQLiteOpenHelper.getTABLE_NAME(), null, null, null, null, null, null); 19//Log出力 20 Log.v("MainActivity", itemSQLiteOpenHelper.getTABLE_NAME()+" cursor generated"); 21//tryでcursorを使いlistに要素を追加していく 22 try{...}catch(Exception e){...} 23 finally { 24 databaseOpenHelper.close(); 25 cursor.close(); 26 Log.v("MainActivity", "Succeeded in close the database and cursor."); 27 } 28 return list; 29}
Java
1//ItemSQLiteOpenHelper 2abstract class ItemSQLiteOpenHelper(context: Context) extends SQLiteOpenHelper { 3 abstract String TABLE_NAME; 4 5 public ItemSQLiteOpenHelper(Context context){ 6 super(context, "ITEM_DATABASE", null, 1); 7 } 8 9 @Override 10 abstract public void onCreate(SQLiteDatabase p0); 11 @Override 12 public void onUpgrade(SQLiteDatabase p0,Int p1,Int p2){} 13}
Java
1//ItemASQLiteOpenHelper 2public final class ItemASQLiteOpenHelper extends ItemSQLiteOpenHelper { 3 @override 4 private final String TABLE_NAME ="ITEM_A_TABLE"; 5 6 public ItemASQLiteOpenHelper(Context context) { 7 super(context); 8 } 9 public String getTABLE_NAME() { 10 return this.TABLE_NAME; 11 } 12 13 @override 14 public void onCreate(SQLiteDatabase database) { 15 database.execSQL("CREATE TABLE " + this.getTABLE_NAME() 16 + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT not null,value TEXT not null);"); 17 } 18}
Java
1//ItemBSQLiteOpenHelper 2public final class ItemBSQLiteOpenHelper extends ItemSQLiteOpenHelper { 3 @override 4 private final String TABLE_NAME ="ITEM_B_TABLE"; 5 6 public ItemBSQLiteOpenHelper(Context context) { 7 super(context); 8 } 9 public String getTABLE_NAME() { 10 return this.TABLE_NAME; 11 } 12 @override 13 public void onCreate(SQLiteDatabase database) { 14 database.execSQL("CREATE TABLE " + this.getTABLE_NAME() 15 + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT not null,value TEXT not null);"); 16 } 17}
試したこと
同一データベースにテーブルを2以上作ってはいけないのかもと思い、adaptListViewの//試したこと1の部分でgenerateDatabasedListの順番をItemAとBを逆にして行った。
というか、一回でも実行した時点でデータベースとItemAのテーブルはもうマシンの中に作られていて、これ調べてももう遅いのではと思ったので、ITEM_DATABASEのテーブル一覧を取得しようと試みたがそれらしきメソッドが調べても見つからない。
###9/6 21:00追記
一部Kotlinからの移植に失敗していたものがあったので修正しました。
また、下記のソースコードにあるようにItemA,Bの両方にLogを追加しました。
アプリを一旦アンインストール、再度実行した所ItemAの方はLogが出ましたが、Bのほうは出ませんでした。
最初はexecSQLの文法ミスを疑っていましたが、このことからBの方はonCreateが実行されずテーブルが作成されていないようです。
Java
1public final class ItemBSQLiteOpenHelper extends ItemSQLiteOpenHelper { 2 ... 3 4 public void onCreate(SQLiteDatabase database) { 5//Logの追加 6 Log.v("ItemBSQLiteOpenHelper","ItemBSQLiteOpenHelper onCreate"); 7 8 database.execSQL("CREATE TABLE " + this.getTABLE_NAME() 9 + " (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT not null,value TEXT not null);"); 10 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。