前提・実現したいこと
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