我想创建 sqlite 数据库文件 DatabaseName.db,其中包含一些应在应用程序路径 (/data/data/MyApplicationName/databases/DatabaseName) 中创建的实体.db) 当我尝试执行下面的代码 fragment 时,但是 DatabaseName.db 文件不存在。为什么?
MyDatabaseSample db = Room.databaseBuilder(context,
MyClass.class,
"DatabaseName.db")
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase ssdb) {
super.onCreate(db);
Log.d(TAG, "Database created - populate database");
}).build();
仅当我创建实体对象的实例并在获取数据库引用 db 后立即将其插入数据库时,才会在应用程序路径中创建数据库。因为我想在创建数据库后立即预填充数据库,所以我认为在回调的 onCreate 方法中执行它是有意义的,但永远不会调用 onCreate 。那么,我如何使用所有代表实体的表创建“DatabaseName.db”文件并使用回调填充数据库?
OBS:我正在使用 Room 版本使用 1.1.0-alpha2 并使用 SDK android API 27 进行编译。
最佳答案
我认为您需要定义一些 Room entities在预填充数据库之前,这就是我所做的并且它按预期工作,这是我到目前为止所做的一些代码:
public class DatabaseCreator {
private static MyDatabaseSample appDatabase;
private static final Object LOCK = new Object();
public synchronized static MyDatabaseSample getDBInstance(final Context context){
if(appDatabase == null) {
synchronized (LOCK) {
if (appDatabase == null) {
RoomDatabase.Callback appDBCallback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
try {
ReadScript.insertFromFile(context, R.raw.populate_db, db);
} catch (IOException e) {
Log.d("DB Population Error", e.toString());
}
}
};
appDatabase = Room.databaseBuilder(context,
MyDatabaseSample.class, "DatabaseName").addCallback(appDBCallback).build();
}
}
}
return appDatabase;
}
}
上面的代码是一个单例,它使用回调的 onCreate 来使用“原始资源”预填充数据库(要将原始资源添加到您的项目中,只需在您的 res 文件夹中创建一个文件夹,如下所示“res/raw"),其中包含一个 sql 脚本。要阅读脚本,我使用了以下代码:
public class ReadScript {
public static int insertFromFile(Context context, int resourceCode, SupportSQLiteDatabase db) throws IOException {
// Reseting Counter
int result = 0;
// Open the resource
InputStream insertsStream = context.getResources().openRawResource(resourceCode);
BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertsStream));
// Iterate through lines (assuming each insert has its own line and theres no other stuff)
while (insertReader.ready()) {
String insertStmt = insertReader.readLine();
if(insertStmt != null){
if(insertStmt.isEmpty()) continue;
db.execSQL(insertStmt);
result++;
Log.d("Statement #", Integer.toString(result));
}
}
insertReader.close();
// returning number of inserted rows
return result;
}
}
然后您只需通过以下操作创建数据库实例:
MyDatabaseSample db = DatabaseCreator.getDBInstance(getContext());
注意:您可以尝试在原始脚本中创建表,但我还没有尝试过。
祝你好运。
关于java - 如何使用 Android Room 创建和预填充 sqlite 数据库文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49312448/