no such table エラーの原因
- aというテーブルをMain.dbに作るHelperクラスをインスタンス化する
- 別のhelperクラスでbというテーブルをMain.db(同一名のDB)に作成する
- SQliteExceptionエラーで落ちる
→bテーブル作成用のHelperクラスのコンストラクタで、Main.dbを新規作成しようとしているが、Main.dbはすでに作成されているため、新しく作ることができず、bテーブルのonCreateが呼ばれないため、テーブルは作成されずno such tableとなる。
A_helper.java
public A_Helper(Context context) {
super(context, "Main.db", null, 1);
}
B_helper.java
public B_Helper(Context context) {
super(context, "Main.db", null, 1);
}
解決策
1.Helperクラスを1つに統合して、onCreateにCREATE TABLE文を2つ記載する。
HogeHelper.java
public HogeHelper(Context context) {
super(context, "Main.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// テーブル作成
db.execSQL("CREATE TABLE " + A_TABLE_NAME +
" (" + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_USER_NAME + " TEXT , "
+ COLUMN_USER_PASSWORD + " TEXT " + ");");
db.execSQL("CREATE TABLE " + B_TABLE_NAME +
" (" + COLUMN_BOOK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_BOOK_TITLE + " TEXT , "
+ COLUMN_BOOK_IMAGE + " TEXT , "
+ COLUMN_BOOK_REVIEW + " TEXT " + ");");
}
2.bテーブルのHelperクラスのDB名を変更する。
A_helper.java
public A_Helper(Context context) {
super(context, "Main.db", null, 1);
}
B_helper.java
public B_Helper(Context context) {
super(context, "Sub.db", null, 1);
}