質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1706閲覧

複数のテーブルからそれぞれのcursorを取得したい

shal0ne

総合スコア51

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/09/06 11:39

編集2018/09/06 12:05

前提・実現したいこと

どこにどのテーブルを作ればいいのかも皆目見当がつかない状態ですが、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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

一つのテーブルにつきデータベースを一つ作るようにしたら動きました。
一つのデータベースには一つのテーブルしか作れない?のやら何やらわけわかめですが(というかそれならテーブル名定義する意味なんで多分違う)、ひとまず解決です。
ありがとうございました。

投稿2018/09/07 06:43

shal0ne

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問