ルームライブラリを使用してデータベースにデータを保存しています。データベースを取得したいです。
このコードを使用しました
private void copyFile() {
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();
String backupDBPath = "photex_db.db";
File currentDB = new File(data, currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
単純なsqlLiteでは機能しますが、ROOMライブラリでは機能しませんでした [〜#〜] room [〜#〜]
データベースを取得する方法はありますか?
ルームの助けを借りてデータベースを作成するクラス `
@Database(entities = {ProjectDataEntity.class, SavedProjectEntity.class},
version = 2)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {
static final String DATABASE_NAME = "photex_db";
private static AppDatabase Instance;
public abstract ProjectDataDao projectDataDao();
public abstract SavedProjectDao savedProjectDao();
public static AppDatabase getInstance(Context context) {
if (Instance == null) {
synchronized (AppDatabase.class) {
if (Instance == null) {
Instance =
Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, DATABASE_NAME)
.build();
}
}
}
return Instance;
}
} `
static final String DATABASE_NAME = "photex_db";
ここでは、photoex_db
を開こうとしています。
String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();
ここでは、photex_db.db
から読み取ろうとしています。
これらは同じではありません。
一部の場所だけでなく、一貫してDATABASE_NAME
を使用することを検討してください。
正常に動作するように修正した後、私のコードに少し間違いがありました
private void copyFile() {
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
String currentDBPath =
getDatabasePath("photex_db").getAbsolutePath();
String backupDBPath = "photex_db.db";
//previous wrong code
// **File currentDB = new File(data,currentDBPath);**
// correct code
File currentDB = new File(currentDBPath);
File backupDB = new File(sd, backupDBPath);
if (currentDB.exists()) {
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
in Android Studioには、右下に[デバイスファイルエクスプローラー]というセクションがあります。このセクションでは、すべてのファイルを探索できます(単純なファイルエクスプローラーアプリでは表示できないため、ルートを実行する必要があります)。
エミュレータが使用しているものであることを確認してください。このエクスプローラーで、「データ」->「データ」に移動し、アプリのパッケージ名を探し、次のステップは「データベース」エントリを見つけることです。このフォルダーにルームデータベースがあります。
このコードを試してください:
String backupDBPath = YourRoomDatabase.getDatabase(context).getOpenHelper().getWritableDatabase().getPath();
データベースのパスを返します。この正確なパスを使用して、コピーするファイルを作成します。それは間違いなく私のために働いたように動作します。
File backupDB = new File(backupDBPath);