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

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

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

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

Java

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

Android Studio

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

Q&A

解決済

2回答

916閲覧

データベースに接続してデータを読み込みたい android studio / SQLite

dedede914

総合スコア62

SQLite

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

Java

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

Android Studio

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

0グッド

0クリップ

投稿2023/03/08 01:01

実現したいこと

android studioでデータベースを使ったアプリを作ってみています。既存のデータベースからデータを引っ張り出してきたいです。

前提

javaで書いています。
androidstudioに既存のデータベースをインポート(?)するところまではできました。ちゃんとandroidstudio内でインポートできていることも確認できました。とりあえず、1列目のデータを上から10個表示させようとしましたが2個目から読み込めませんのエラーが出ました。
MainActivity.javaからSearchFragment.javaを呼び出しています
データベースは510x52の大きさです

3日ほど格闘しています。どうかよろしくお願いします。

発生している問題・エラーメッセージ

#sql="select colum1 from table1 limit 10" のエラー 2023-03-07 19:13:53.996 15655-15655/com.example.dicapp E/CursorWindow: Failed to read row 2, column 1 from a CursorWindow which has 10 rows, 1 columns. 2023-03-07 19:13:54.001 15655-15655/com.example.dicapp E/AndroidRuntime: FATAL EXCEPTION: main ~省略 Caused by: android.view.InflateException: Binary XML file line #81: Binary XML file line #81: Error inflating class fragment Caused by: android.view.InflateException: Binary XML file line #81: Error inflating class fragment Caused by: java.lang.IllegalStateException: Couldn't read row 2, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. .... #sql="PRAGMA table_info(table1)" のときのエラー 2023-03-07 19:09:21.315 15481-15481/com.example.dicapp E/CursorWindow: Failed to read row 7, column 6 from a CursorWindow which has 52 rows, 6 columns. 2023-03-07 19:09:21.319 15481-15481/com.example.dicapp E/AndroidRuntime: FATAL EXCEPTION: main   ~省略 Caused by: android.view.InflateException: Binary XML file line #81: Binary XML file line #81: Error inflating class fragment Caused by: android.view.InflateException: Binary XML file line #81: Error inflating class fragment Caused by: java.lang.IllegalStateException: Couldn't read row 7, col 6 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. .....

該当のソースコード

java

1public class SearchFragment extends Fragment { 2 private SearchViewModel homeViewModel; 3 private FragmentSearchBinding binding; 4 private DatabaseHelper helper=null; 5 6 public View onCreateView(@NonNull LayoutInflater inflater, 7 ViewGroup container, Bundle savedInstanceState) { 8 homeViewModel =new ViewModelProvider(this).get(SearchViewModel.class); 9 binding = FragmentSearchBinding.inflate(inflater, container, false); 10 View root = binding.getRoot(); 11 12//ここが問題のコードです 13 setConj(helper); 14 15 return root; 16 } 17 18 19 20 public void setConj(DatabaseHelper helper){ 21 //helperを準備 22 helper=new DatabaseHelper(getContext());//元々this 23 //データベース取得 24 try(SQLiteDatabase db=helper.getWritableDatabase()){ 25 Toast.makeText(getContext(),"接続済み", Toast.LENGTH_SHORT).show(); 26 } 27 28 StringBuilder builder = new StringBuilder(); 29 SQLiteDatabase db = helper.getWritableDatabase(); 30 try { 31 int i =0; 32 //何個か試したうちの3つです 33 String sql="select colum1 from table1 limit 10"; //error 34 //sql="PRAGMA table_info(table1)"; //error 35 //sql="SELECT name FROM sqlite_master WHERE type='table';" //ちゃんとテーブル名が返ってきました 36 37 Cursor cursor = db.rawQuery(sql , null); 38 cursor.moveToFirst(); 39 builder.append(cursor.getString(i)); 40 while (cursor.moveToNext()) { 41//ここがエラーの出る箇所です。 42     //cursor.getString(i)の行をコメントアウトしたらエラーは出なかったので、クエリ自体はうまく処理されている?? 43 builder.append(cursor.getString(i)); 44 i++; 45 } 46 Log.e("debug", builder.toString()); 47 }finally{ 48 db.close(); 49 } 50 } 51}

試したこと

sql="SELECT name FROM sqlite_master WHERE type='table';"
でクエリを実行したときは、ちゃんとテーブルの名前が返ってきました。
コメントアウトして、どこでエラーが出ているのか確認したら、cursorからwhileを使って順に値を挿入している部分でエラーが発生しているようでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2023/03/08 04:08

>//データベース取得 >try(SQLiteDatabase db=helper.getWritableDatabase()){ >Toast.makeText(getContext(),"接続済み", Toast.LENGTH_SHORT).show(); >} コレは意味が無いでしょう。 try-resource は try の () 内のリソースを {} を抜ける時に close します。 "接続済み" と表示して close してはトーストを出す意味もありません。 SQLiteDatabase は通常の使用においては helper 内で管理されるため、明示的に close する必要はありません。
dedede914

2023/03/08 18:46

そうなんですね。サイトのページコピペが多くてちゃんと意味が分かっていませんでした ありがとうございます
guest

回答2

0

Cursor の get~ で指定する index は、行では無く列です。

投稿2023/03/08 04:10

jimbe

総合スコア12648

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

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

0

ベストアンサー

結論から言えば、変数 i を増分しているのが間違いです。

前提として、以下のことを理解している必要があります。
・Cursor は、処理結果表の現在処理中の行を保持し、メソッドで行を移動。
・今回のSQLは、colum1 のみを取得しているので、テーブルの列がいくつあっても、1列。

エラーの発生機序ですが、以下のようになります。
while前の cursor.getString(i) では、i が0なため、先頭行の1列目が取得され、正常に終了します。
cursor.moveToNext() で、現在行が2行目に移りますが、こちらも、i が 0 なので、正常処理。
ですが、次のループでは、i が増加しになっているため、2列目を取得しようとして、存在しないためにエラーになります。

"SELECT name FROM sqlite_master WHERE type='table';" が正常に処理されたのは、1行しか存在せず、while ループに入らなかったためと思われます。

余談ですが、カーソルではなく、2次元配列などで結果を全て取得し、i に該当する行のデータを取得するような処理だった場合は、1行目が2回取得されることになり、エラーにはならないものの、不具合となるでしょう。

投稿2023/03/08 02:35

YT0014

総合スコア1708

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

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

dedede914

2023/03/08 18:38

詳細に説明ありがとうございました!!! 本当にありがとうございました!!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問