当前位置: 首页 > 知识库问答 >
问题:

如何使用带有预填充数据库的Room持久性库?

齐献
2023-03-14

我想使用预先填充的数据库的房间,但我不明白如何告诉房间在哪里找到我的数据库。

现在我将它放在src/main/assets/databases中,当我为房间数据库创建实例时,我是这样创建的:

Room.databaseBuilder(
    getApplicationContext(),
    AppDatabase.class,
    "justintrain.db"
)
.allowMainThreadQueries()
.build();

这样一来,我认为它每次都在创建一个新的数据库,或者说,它没有使用预填充的数据库。

我怎样才能找到我的数据库?

共有3个答案

翟弘
2023-03-14

我也有同样的问题,所以我创建了一个完全这样做的库。公认的答案有效,但我认为使用库更容易。

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

习和通
2023-03-14

更新(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链接所需的代码

昝光临
2023-03-14

这就是我如何解决它的,以及如何使用预填充的数据库(最多到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表单中反映出来,但它没有反映出来。我被这个