Место Ваш .db
файл в assets/databases
(или действительно любая папка там, пока это находится под assets
).
Комната 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()
функция. Проверьте официальная документация о том, как сделать это.
Аналогичное решение с комнатой, не пользуясь внешними библиотеками: 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();
}
}
}