web-dev-qa-db-ja.com

ルームがAndroidデータベースを保存する場所

ルームライブラリを使用してデータベースにデータを保存しています。データベースを取得したいです。

このコードを使用しました

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;
}

} `

14
Usman Saeed
static final String DATABASE_NAME = "photex_db";

ここでは、photoex_dbを開こうとしています。

String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();

ここでは、photex_db.dbから読み取ろうとしています。

これらは同じではありません。

一部の場所だけでなく、一貫してDATABASE_NAMEを使用することを検討してください。

14
CommonsWare

正常に動作するように修正した後、私のコードに少し間違いがありました

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();
    }
}
5
Usman Saeed

in Android Studioには、右下に[デバイスファイルエクスプローラー]というセクションがあります。このセクションでは、すべてのファイルを探索できます(単純なファイルエクスプローラーアプリでは表示できないため、ルートを実行する必要があります)。

エミュレータが使用しているものであることを確認してください。このエクスプローラーで、「データ」->「データ」に移動し、アプリのパッケージ名を探し、次のステップは「データベース」エントリを見つけることです。このフォルダーにルームデータベースがあります。

1
AlexPad

このコードを試してください:

String backupDBPath = YourRoomDatabase.getDatabase(context).getOpenHelper().getWritableDatabase().getPath();

データベースのパスを返します。この正確なパスを使用して、コピーするファイルを作成します。それは間違いなく私のために働いたように動作します。

File backupDB = new File(backupDBPath);
0
Prashant