60
задан 17 August 2018 в 13:50

2 ответа

Рабочее решение 2019 года без взломов или зависимостей (Kotlin)

  1. Место Ваш .db файл в assets/databases (или действительно любая папка там, пока это находится под assets).

  2. Комната 2.2's Использования, существующая createFromAsset() функция, передающая в пути к базе данных. Например, если бы Ваш файл базы данных называют my_data.db и находится под databases каталог assets папка, то Вы сделали бы createFromAsset("databases/my_data.db").

Принятие Вашего имени базы данных (например, my_data) хранится в постоянной переменной, названной DATABASE_NAME, можно использовать этот код кода:

Room.databaseBuilder(
                    context.applicationContext,
                    MyDatabase::class.java,
                    DATABASE_NAME
                )
                    .createFromAsset("databases/$DATABASE_NAME.db")
                    .build()

Важный : Удостоверьтесь, что схема Вашего класса/объекта данных точно соответствует схеме Вашего .db файл. Например, если столбец явно не отмечен как [1 112] в .db файл, то это означает, что столбец может иметь нулевые значения в нем. В Kotlin необходимо было бы соответствовать этому [1 114] в классе данных. Если Вы просто сделаете val colName: dataType, то Kotlin скомпилирует это в NOT NULL столбец, и это выдаст исключение, когда Вы попытаетесь запустить свое приложение.

Примечание : Если вместо этого Вы хотите создать базу данных Room из файла базы данных, который Вы загружаете на само устройство на базе Android, можно альтернативно использовать эти createFromFile() функция. Проверьте официальная документация о том, как сделать это.

6
ответ дан 1 November 2019 в 10:43

Аналогичное решение с комнатой, не пользуясь внешними библиотеками: 1. Скопируйте свою базу данных в папке активов 2. Скопируйте свою базу данных с папки активов

public class MainActivity extends AppCompatActivity {

public static AppDatabase db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    copyDatabase(getApplicationContext(), "yourdatabase.db");

    db = Room.databaseBuilder(getApplicationContext(), .class, "yourdatabase.db").allowMainThreadQueries().build();
}

private void copyDatabase(Context context, String databaseName) {
    final File dbPath = context.getDatabasePath(databaseName);

    // If the database already exists, return
    if (dbPath.exists()) {
        Log.d("Activity", "db Path Exists");
        return;
    }

    // Make sure we have a path to the file
    dbPath.getParentFile().mkdirs();

    // Try to copy database file
    try {
        final InputStream inputStream = context.getAssets().open(databaseName);
        final OutputStream output = new FileOutputStream(dbPath);

        byte[] buffer = new byte[8192];
        int length;

        while ((length = inputStream.read(buffer, 0, 8192)) > 0) {
            output.write(buffer, 0, length);
        }

        output.flush();
        output.close();
        inputStream.close();
    }
    catch (IOException e) {
        Log.d("Activity", "Failed to open file", e);
        e.printStackTrace();
    }
}

}

1
ответ дан 1 November 2019 в 10:43

Другие вопросы по тегам:

Похожие вопросы: