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

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

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

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android

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

Q&A

解決済

1回答

2315閲覧

Androidでアプリを起動後にsqliteからデータを読み込む時に極たまにnullが返ってきて落ちてしまう

kipipipi

総合スコア60

SQLite

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android

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

0グッド

0クリップ

投稿2020/08/05 07:14

編集2020/08/05 08:53

現在Androidのアプリを作成中で、そのアプリを起動時に内蔵のsqliteからデータを取ってくる際に
10~20回中に1回程度の割合でnullが返ってきてしまい、アプリが落ちてしまいます。
一般的にこんなに高頻度でnull、つまりデータの取得に失敗してしまうものでしょうか??

sqliteからデータを持ってこれなければ始まらないので、一度nullだった場合に、もう一度SELECTを試すようにしていますが,極たまにnullが返されてしまいます。

対処方法や、原因に心当たりがある方はいらっしゃいますか??
よろしくお願いします。

java

1 2// たまにこの子がnullを返してきます。 3// fileidは確実に存在しているのは確認しています 4retStr = sqlHelper.readArray("FILES", "filename", "WHERE fileid=\"" + fileid + "\" AND use=1 ORDER BY sortnum ASC"); 5 6 7 public String[] readArray(String tablename ,String filename,String wText) { 8 9 String sql = "SELECT "+filename+" FROM "+tablename+" "+wText+";"; 10 int numRows = 0; 11 String entries[] = null; 12 try { 13 SQLiteDatabase db = getReadableDatabase(); 14 Cursor c = db.rawQuery(sql, null); 15 numRows = c.getCount(); 16 if (numRows != 0) { 17 entries = new String[numRows]; 18 c.moveToFirst(); 19 for( int i = 0; i < numRows; i++ ) { 20 entries[i]=c.getString(0); 21 c.moveToNext(); 22 } 23 } else { } 24 c.close(); 25 db.close(); 26 } catch (Exception e) { 27      e.printStackTrace(); 28 } 29 30 return entries; 31 }
java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.

と表示されていました。
現在このエラーについて調査しています。

また、この命令は起動時だけでなく、かなり高頻度で行っておりこちらも極たまに落ちてしまいます。
ここでsqlに保存されているimageファイルの名前をlistにして,指定のディレクトリから読み込む仕様です。
高頻度すぎて落ちてしまうのはなんとなく理解できるのですが,起動時に落ちてしまうのはおかしいなと思っています。
コードに問題がありそうでしたらご指摘いただけると嬉しいです。
よろしくお願いします!

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

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

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

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

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

dodox86

2020/08/05 07:23

> 一般的にこんなに高頻度でnull、つまりデータの取得に失敗してしまうものでしょうか?? そんなことないと思いますよ。確実にアプリを作っているのにそんなに不安定であれば、OS、実行環境として不良品です。アプリの起動時にダメなときがある、のであれば、Androidのアプリのライフサイクル、起動の仕方をちゃんと意識してプログラミングされていない可能性があります。 https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja あとは、問題が再現するコードをちゃんと提示しないと問題点が分からないと思います。
mdj

2020/08/05 07:24

処理内容が何も分からないので、あるともないとも言えないと思いますが。
Orlofsky

2020/08/05 07:29

内臓 はモツ煮の材料です。 各ソフトウェアのバージョンと現象を再現できるだけのコードを質問に追記できた方が適切なコメントが付き易いです。 コードはMarkdown https://teratail.com/help/question-tips#questionTips3-7 使ってください。
dodox86

2020/08/05 08:14

追記を読んで: 起動時のどこで呼んでいるかも意外と重要です。ActivityのonCreate, onStart, onResumeなどです。いつ呼ばれているのか、ご提示の内容では分かりません。例えばsqlHelper変数はインスタンス変数ですので、その初期化のタイミングも重要です。私が挙げたリンクも読んでください。
dodox86

2020/08/05 08:16

readArrayメソッド中で発生したExceptionを握り潰している(catch節が空)から原因が分からないのではないですか。
kipipipi

2020/08/05 08:57

dodox86 様 ありがとうございます。 catchについて追記しました。よろしくお願いします。 こちらのアプリは現在1つのActivityしかもたず 、onCreate時に初めて呼ばれ、以降timer.scheduleで毎秒または数秒おきに呼ばれます。
dodox86

2020/08/05 09:20

コードを追加するだけでなく、実際に何が起こっているか(catchに引っかかって何が報告されているのか)を調べてみてください。それをヒントに、ご自分で解決できることもあります。
guest

回答1

0

自己解決

マルチスレッドで作成していたため、データを読み取る時に別のスレッドによってDBを閉じていたのが問題のようでした!
インスタンスが乱立しないように、また、close()をコメントアウトすることで全く落ちなくなりました!

投稿2020/08/07 06:12

kipipipi

総合スコア60

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問