Androidstudioに外部で作ったデータベースファイルをインポートして使いたいです。
AndroidstudioのassetsフォルダにSQLiteで作ったデータベースファイルverbs.dbをコピペして,それを扱うアプリを作っています。
今まではちゃんと機能していましたが、データベースのデータをガラッと変えたかったので再度android studioにデータベースファイルをコピペしましたが、うまいこといかなかったので質問させていただきました。
DatabaseHelper.javaはウェブサイトのほぼコピペで何か所かいじった程度です。
ぐちゃぐちゃしたのでいったんデータベースのファイルを全消しして(Androidstudioとemulator)何度かやり直しました
プログラムを実行させたら、ちゃんとAndroidEmulatorのアプリのファイルのところにコピーはされています。が、クラッシュしてアプリが閉じてしまいます。何が問題でしょうか
よろしくお願いします
下Emulatorのファイルです
java
//DatabaseHelper.java package com.example.dicapp; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DatabaseHelper extends SQLiteOpenHelper { private static String DB_NAME = "verbs"; private static String DB_NAME_ASSET = "verbs.db"; private static final int DATABASE_VERSION = 1; private final Context mContext; private final File mDatabasePath; public DatabaseHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); mContext = context; mDatabasePath = mContext.getDatabasePath(DB_NAME); } /** * asset に格納したデータベースをコピーするための空のデータベースを作成する */ public void createDatabase() throws IOException { boolean dbExist = checkDatabaseExists(); if (dbExist) { // すでにデータベースは作成されている } else { // このメソッドを呼ぶことで、空のデータベースがアプリのデフォルトシステムパスに作られる SQLiteDatabase db = getReadableDatabase(); db.close(); try { // asset に格納したデータベースをコピーする copyDatabaseFromAsset(); String dbPath = mDatabasePath.getAbsolutePath(); SQLiteDatabase checkDb = null; try { checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); } catch (SQLiteException e) { } if (checkDb != null) { checkDb.setVersion(DATABASE_VERSION); checkDb.close(); } } catch (IOException e) { throw new Error("Error copying database"); } } } /** * 再コピーを防止するために、すでにデータベースがあるかどうか判定する * * @return 存在している場合 {@code true} */ private boolean checkDatabaseExists() { String dbPath = mDatabasePath.getAbsolutePath(); SQLiteDatabase checkDb = null; try { checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // データベースはまだ存在していない } if (checkDb == null) { // データベースはまだ存在していない return false; } int oldVersion = checkDb.getVersion(); int newVersion = DATABASE_VERSION; if (oldVersion == newVersion) { // データベースは存在していて最新 checkDb.close(); return true; } // データベースが存在していて最新ではないので削除 File f = new File(dbPath); f.delete(); return false; } /** * asset に格納したデーだベースをデフォルトのデータベースパスに作成したからのデータベースにコピーする */ 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(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
データベースを変更する前はうまく機能していたのでここは問題ないとは思いますが、一応
java
//MainActivity.javaのデータベースを読み込む部分 public void mainfunc(DatabaseHelper helper){ //helperを準備 helper=new DatabaseHelper(getContext()); //データベース取得 try(SQLiteDatabase db=helper.getWritableDatabase()){ //command Toast.makeText(getContext(),"接続済み", Toast.LENGTH_SHORT).show(); } try { helper.createDatabase(); } catch (IOException e) { throw new Error("Unable to create database"); } StringBuilder builder = new StringBuilder(); SQLiteDatabase db = helper.getReadableDatabase(); //以下コード続きます }
まだ回答がついていません
会員登録して回答してみよう