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

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

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

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

Android

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

Android Studio

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

Q&A

1回答

2761閲覧

Android9でSQLiteが使えなくなってしまう

setuna0531

総合スコア128

SQLite

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2020/12/01 04:41

編集2021/04/23 02:11

前提・実現したいこと

Android8で動いているアプリをAndroid9で動くのか確認をしています。

###現状
Androidのアプリを開発していた人がいなくなったため、変わりに作業をしている状況です。
Javaは触ったことがなく、何もわからない状態で作業を行っています。

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

Android8で動いているものをAndroid9に入れたところ、
SQLiteが動かなくなってしまっている状況です。

エラー内容は下記のとおりです。

2020-12-01 13:23:24.681 12149-12149/com.midoriacres.cloud.apporder E/AndroidRuntime: FATAL EXCEPTION: main Process: com.midoriacres.cloud.apporder, PID: 12149 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.midoriacres.cloud.apporder/com.midoriacres.cloud.apporder.StaffChange}: android.database.sqlite.SQLiteException: no such table: Tanto_MT (code 1 SQLITE_ERROR): , while compiling: select * from Tanto_MT order by MstTantoCD at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3076) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3211) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1857) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6859) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: android.database.sqlite.SQLiteException: no such table: Tanto_MT (code 1 SQLITE_ERROR): , while compiling: select * from Tanto_MT order by MstTantoCD at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408) at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1347) at com.midoriacres.cloud.apporder.StaffChange.onCreate(StaffChange.java:104) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3056)

テーブルがないよ!っていうのはわかるのですが、そもそも論としてデバックモードで確認したところ、
date.dbにテーブルが存在しません。
※Android8でデバックするとdate.dbにデータが存在します。

###ソース
おそらくここがおかしいと思いますが直し方が全くわかりません。

BaseActivity.java mDBHelper = new DatabaseHelper(this); try { mDBHelper.createEmptyDataBase(); mDb = mDBHelper.getWritableDatabase(); } catch (IOException e) { e.printStackTrace(); }

試したこと

「mDb.close();」を追加してDBのオープン状態を閉じたりもしましたが、
DBが開いてないからアプリが使えないよ!と表示されたため消しました。

Android StudioにてAndroid9の端末をつなぎデバックモードでテストを行っています。
No Such Tableとなってしまっておりお手上げ状態な状況です。

###追記

private void copyDataBaseFromAsset() throws IOException{ // asset 内のデータベースファイルにアクセス InputStream mInput = mContext.getAssets().open(DB_NAME_ASSET); // デフォルトのデータベースパスに作成した空のDB OutputStream mOutput = new FileOutputStream(mDatabasePath); // コピー byte[] buffer = new byte[1024]; int size; while ((size = mInput.read(buffer)) > 0) { mOutput.write(buffer, 0, size); } // Close the streams mOutput.flush(); mOutput.close(); mInput.close(); }

データベースをコピーしているソースを見つけました。
データベースをコピーする際に開きっぱなしになっていることでSQLがうまく動かない
という記事をどこかで見つけました。

paste方法がAPI28から変更になっている?という情報を耳にしましたが、
Googleで検索をかけましたが変更点などが見つかりませんでした。

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

Android Studio 4.1.1
Windows10

test端末:
Android9 LENOVO Lenovo TB-X505F

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

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

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

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

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

dodox86

2020/12/01 05:28

> Javaは触ったことがなく、何もわからない状態で作業を行っています。 Javaが分からないと言うと、Androidでの開発の方法もあまりご存じないのかもしれませんが、回答として何をお求めなのでしょう。回答者も困ると思います。
setuna0531

2020/12/01 06:37

dodox86様 コメントありがとうございます。 Andoroid開発は今までやったことありません。 求めている回答としては、SQLiteが動作すればアプリ自体に問題はないと思うので、とりあえずSQLiteでデータを作成出来るように修正したいです。 ※Android8ではテーブルとデータが作成されているのに9だと作成されないっていう事はあるのかも疑問です。
dodox86

2020/12/01 07:04

もし回答をJavaで書いても、分からないのではないか?と言う疑問です。
setuna0531

2020/12/01 07:13

dodox86様 >もし回答をJavaで書いても、分からないのではないか?と言う疑問です。 確かにそうかも知れません。 今後メンテナンス等を行う事になると思うので、Javaは勉強する予定です。 現状でも、なんとなくのニュアンスはわかるかと思います。
dodox86

2021/04/23 02:32

[2021/04/23 11:11]の質問の編集を読んで: > InputStream mInput = mContext.getAssets().open(DB_NAME_ASSET); getAssets()で開いたコピー元のDBファイルをそのままコピーしているようなので、DBのバージョンやファイル形式に不整合が生じていたりするのではありませんか。 getAssets()で取得しているということはアプリが抱えている assetsフォルダー内にあらかじめ収めたテーブル等を作成済みのDBファイルを使っているのだと思います。(<あくまで推測) で、それは恐らく古いAndroidバージョンで作られたもので、それを上書きコピーしている上にSQLite利用時には > mDb = mDBHelper.getWritableDatabase(); で取得したものを利用してSQLの操作をしているので、何かおかしくなっているのではないでしょうか。
guest

回答1

0

たぶん中身を解析していかないと完全な原因の特定は難しいかと思いますが、「android sqlite api28」で検索をかけるとapi28で同じようにエラーが発生している人がいる、これが原因の可能性が高いかもしれません?(全体のコードがないのであくまで推測です)
teratailで以前解決していた方のコメントを抜粋します。

今回質問させていただいた、 API28においてsqlite関係のエラーでアプリが落ちてしまう現象について、 解決いたしました! https://stackoverflow.com/questions/50476782/android-p-sqlite-no-such-table-error-after-copying-database-from-assets 上記urlを参考に、API28で発生することが多いエラーに対処することで、治りました。 アセットからデータベースのファイルをコピーして使っていたのですが、 コピー前にデータベースを開いたままにしていた事が原因でした。 (getReadableDatabase後にcloseすることで解決しました) API27以前では動いていたため今まで気づきませんでした…。 同時に、API28でもsqliteは使用可能であるという事が確認できました! 問題解決方法を探る中でも、deprecatedの件など大変参考になりました。 ご回答いただき、ありがとうございました!

とのことです、以下、参考URLです。

https://teratail.com/questions/140695
https://stackoverflow.com/questions/50476782/android-p-sqlite-no-such-table-error-after-copying-database-from-assets
https://stackoverflow.com/questions/58690724/android-pie-api-28-sqlite-no-such-table-error

以上、よろしくお願いいたします。

===追記
Android9でのsqliteのエラーは結構あるみたいですね。
「android pie」「android 9」「android api28」「sqlite error」「no such table」
あたりを組み合わせて調べると同じ事象があるかもしれません。

https://teratail.com/questions/140951
https://stackoverflow.com/questions/50476782/android-p-sqlite-no-such-table-error-after-copying-database-from-assets
https://stackoverflow.com/questions/52706557/sqlite-no-such-table-error-android-p-problem

エラーが発生する状態を提供いただけるのであれば解析も可能かと思います。(コード全体でなくてもエラーが発生するところだけを抜き出して、エラー状態を作ってプロジェクトを作っていただくなど)

以上、よろしくお願いいたします。

投稿2020/12/12 05:01

編集2020/12/14 07:15
razuma

総合スコア1313

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

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

setuna0531

2020/12/14 07:00

ご回答ありがとうございます! いただいたURLも確認し、試してみましたが、改善には至りませんでした。 SQLiteでデータベースを管理しているアプリになるのですが、データベースにテーブルが 一件も登録されていないことになっているため何もできない状況です。 アンドロイド8.0などではデータベースは作成されており、ストレージから確認することができるため、コピーをし、アンドロイド9で同じファイル階層に貼り付けを行ってもテーブルがありませんと言われてしまっておりお手上げ状態です。 JavaとSQLiteの知識があれば解析できると思いますが、その知識が皆無という感じです。 私が作ったアプリではないので余計わからないことだらけというのもあります。 引き続き検索、調査をしてみます。 ご回答ありがとうございました!
razuma

2020/12/14 07:17

一応、回答追記させていただきました。 他の方の回答や、調査によって進展することをお祈りさせていただきます。 以上、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問