Где сохранить базу данных 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 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;
    }


}

person Usman Saeed    schedule 08.07.2017    source источник
comment
он работает в простом sqlLite - не на многих устройствах и не для многих пользователей. Никогда не указывайте пути жестко. Используйте getDatabasePath(), пожалуйста. не работал с библиотекой ROOM - если вы используете getDatabasePath(), он должен работать с Room. Если у вас возникнут проблемы, предоставьте минимальный воспроизводимый пример, который будет включать RoomDatabase, где вы предоставляете информацию в Room о том, какую базу данных использовать.   -  person CommonsWare    schedule 08.07.2017
comment
@CommonsWare Я пробовал getDatabasePath (), это не помогает :(   -  person Usman Saeed    schedule 10.07.2017
comment
Затем, как я уже писал, предоставьте минимальный воспроизводимый пример, который будет включать RoomDatabase, в котором вы предоставляете информацию В комнату о том, какую базу данных использовать.   -  person CommonsWare    schedule 10.07.2017
comment
Я обновил вопрос, посмотрите, это вы имеете в виду   -  person Usman Saeed    schedule 10.07.2017
comment
Вы можете проверить этот ответ. Возможно, вы просто неправильно создали базу данных.   -  person WorieN    schedule 10.07.2017


Ответы (6)


static final String DATABASE_NAME = "photex_db";

Здесь вы пытаетесь открыть photoex_db.

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

Здесь вы пытаетесь читать из photex_db.db.

Это не то же самое.

Вы можете подумать об использовании DATABASE_NAME последовательно, а не только в некоторых местах.

person CommonsWare    schedule 10.07.2017
comment
Куда мне позвонить getDatabasePath(). Я имею в виду, какой класс это предоставляет? - person Mayur Rokade; 12.01.2018
comment
@MayurRokade: getDatabasePath() - это метод на Context. - person CommonsWare; 12.01.2018

в Android Studio в правом нижнем углу есть раздел под названием «Device File Explorer». В этом разделе вы можете изучить все файлы (которые вы не можете увидеть в простом приложении-проводнике файлов, потому что вам нужно запустить корень).

Убедитесь, что вы работаете с эмулятором. В этом проводнике вам нужно перейти в «данные» -> «данные», найти имя пакета вашего приложения, и следующий шаг - найти запись «база данных», в этой папке находится база данных вашей комнаты.

person AlexPad    schedule 24.10.2018

После исправления ошибок в моем коде произошла небольшая ошибка.

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();
    }
}
person Usman Saeed    schedule 11.07.2017
comment
getDatabasePath (photex_db) возвращает файловый объект, File currentDB = getDatabasePath (photex_db) для простоты - person hjchin; 04.07.2018
comment
Чтобы получить путь к хранилищу базы данных комнаты с помощью SupportSQLiteOpenHelper, обратитесь по ссылке: stackoverflow.com/a/57069135/5453198 - person Sackurise; 18.07.2019

Попробуйте этот код:

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

Он вернет путь к вашей базе данных. Используйте этот точный путь, чтобы создать файл, в который вы хотите его скопировать. Это определенно сработает, как сработало для меня.

File backupDB = new File(backupDBPath);
person Prashant    schedule 28.04.2018

Согласно doc getDatabasePath Returns the absolute path on the filesystem where a database created with openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) is stored. В случае Номер не работает

person Chakma    schedule 26.05.2020
comment
Просто хотел отметить, что я использую Room (2.3.0) и getDatabasePath () у меня работает правильно. - person codemonkey; 28.05.2021

//kotlin
Room.databaseBuilder(context, AppDatabase::class.java, "appData.sqlite")
    .addMigrations(
        MIGRATION_1_2,
        MIGRATION_2_3
    )
    .build()
    .also {
        Log.d("<DEV>", it.openHelper.writableDatabase.path)
    }

сфокусируйтесь на нем. openHelper.writableDatabase.path, где это ваш объект db, унаследованный от RoomDatabase

person alexis    schedule 15.07.2020