Где сохранить базу данных Android?
Я использую библиотеку Room для сохранения данных в базе данных. Я хочу получить базу данных.
использовал этот код
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 Library 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;
}
}
Ответы
Ответ 1
static final String DATABASE_NAME = "photex_db";
Здесь вы пытаетесь открыть photoex_db
.
String currentDBPath=getDatabasePath("photex_db.db").getAbsolutePath();
Здесь вы пытаетесь читать из photex_db.db
.
Это не одно и то же.
Вы можете использовать DATABASE_NAME
последовательно, а не только в некоторых местах.
Ответ 2
В моем коде была небольшая ошибка, после исправления ее хорошего качества
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();
}
}
Ответ 3
в Android Studio внизу справа есть раздел "Device File Explorer". В этом разделе вы можете исследовать все файлы (которые вы не можете увидеть в простом приложении для просмотра файлов, потому что вам нужно запустить root).
Убедитесь, что вы работаете с эмулятором. В этом проводнике вам нужно перейти в "data" → "data", найти имя пакета вашего приложения, и следующий шаг - найти запись "database", в этой папке находится ваша база данных Room.
Ответ 4
Попробуйте этот код:
String backupDBPath = YourRoomDatabase.getDatabase(context).getOpenHelper().getWritableDatabase().getPath();
Он вернет путь к вашей базе данных. Используйте этот точный путь для создания файла, в который вы хотите его скопировать. Это определенно будет работать, как у меня.
File backupDB = new File(backupDBPath);