我想使用预先填充的数据库的房间,但我不明白如何告诉房间在哪里找到我的数据库。
现在我将它放在src/main/assets/databases
中,当我为房间数据库创建实例时,我是这样创建的:
Room.databaseBuilder(
getApplicationContext(),
AppDatabase.class,
"justintrain.db"
)
.allowMainThreadQueries()
.build();
这样一来,我认为它每次都在创建一个新的数据库,或者说,它没有使用预填充的数据库。
我怎样才能找到我的数据库?
我也有同样的问题,所以我创建了一个完全这样做的库。公认的答案有效,但我认为使用库更容易。
AppDatabase db = RoomAsset
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database_name.db")
.build();
将其添加到您的根构建中。存储库末尾的渐变:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
添加依赖项
dependencies {
// ... other dependencies
implementation 'com.github.humazed:RoomAsset:v1.0'
}
你可以在这里找到图书馆:https://github.com/humazed/RoomAsset
更新(2019年11月7日)
自2.2.0版以来,Room现在支持使用开箱即用的预打包数据库
https://developer.android.com/jetpack/androidx/releases/room#2.2.0
版本2.2.0之前的解决方案:没有任何其他外部库的简单解决方案。
Room依赖现有的Android框架代码来创建或打开数据库。如果查看FrameworkSQLiteOpenHelper
(文件室版本的SQLiteOpenHelper
)的源代码,它会在内部调用SQLiteOpenHelper。getReadableDatabase()
和其他需要的方法。
因此,最简单的解决方案是将数据库文件从assets目录复制到mContext。getDatabasePath(“my database.sqlite”)
在创建带有Room的数据库之前。
在您的例子中,代码如下所示-
private final String DB_NAME = "my-database.sqlite";
private MyDatabase buildDatabase(Context context) {
final File dbFile = context.getDatabasePath(DB_NAME);
if(!dbFile.exists()) {
copyDatabaseFile(dbFile.getAbsolutePath());
}
return Room.databaseBuilder(context.getApplicationContext(),
MyDatabase.class, DB_NAME)
.build();
}
private void copyDatabaseFile(String destinationPath) {
// code to copy the file from assets/database directory to destinationPath
}
此链接具有复制带有代码的DB链接所需的代码
这就是我如何解决它的,以及如何使用预填充的数据库(最多到v.alpha5室)发布应用程序
>
将您的SQLite DBdatabase\u名称放入。db
进入资产/数据库
文件夹
从该回购协议中获取文件,并将其放入名为sqlAsset
在类中,相应地修改Room的DB创建代码:
Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class,
"database_name.db")
.openHelperFactory(new AssetSQLiteOpenHelperFactory())
.allowMainThreadQueries()
.build();
请注意,您必须使用“database\u name.db”
而不是getDatabasePath()
或其他方法:它只需要文件名。
我习惯于使用Arraylist,下面您可以看到我为存储数据所做的尝试: 这就是我尝试过的,但遗憾的是,这并不奏效: 下面你可以找到我剩下的代码,但上面的一个应该足以让我清楚的想要做什么... } 我创建了Dao类,如下所示::- @DAO公共接口DeckBuilderDao{
我正在使用android的房间持久性库,如果有人能帮助我使用外键,如何通过使用外键获取数据,我将不胜感激。
//内容提供程序代码 公共静态最终字符串授权=“com.battlestarMathematica.stayfresh.pantryprovider”; //游标加载程序代码
当我试图更改数据库中表的模式/数据时,我遇到了一个无法解决的问题。我正在用Rooms.CreateFromAsset方法预填充数据库。 当我使用以下代码构建数据库时: 和这个数据类:
下面是Kotlin中的类: 但当我试图运行应用程序时,它立即崩溃。以下是崩溃日志: 类似乎不是自动生成的。我检查了从codelab下载的原始java应用程序,发现是自动生成的。
我正在工作的Android房间持久库。我还在我的项目中实现了双向数据绑定。在项目中,我插入用户的方法是填写一个表单,将所有用户显示在行中,然后单击“特定用户行”更新用户。下面是我的UserDao类: 对于数据绑定,我绑定UserFormActivity中的用户模型 在userModel中获取user数据进行更新后,我希望user数据在执行数据绑定的user表单中反映出来,但它没有反映出来。我被这个