我开始在Android ROOM持久化库中工作,并遇到了Pre-Populating database。在本文中,他们提到了将.db文件添加到assets文件夹中。但问题是如何在线将.sqlite文件转换为.db文件。
这是一个全新的项目,所有的数据都是预先加载的,只有读操作。我尝试使用房间库来使用它,但是失败了。
请帮助我在获得最好的方法来转换.sqlite文件到.db文件或任何其他方式编程这样做。
我开始在Android ROOM持久化库中工作,并遇到了Pre-Populating database。在本文中,他们提到了将.db文件添加到assets文件夹中。但问题是如何在线将.sqlite文件转换为.db文件。
这是一个全新的项目,所有的数据都是预先加载的,只有读操作。我尝试使用房间库来使用它,但是失败了。
请帮助我在获得最好的方法来转换.sqlite文件到.db文件或任何其他方式编程这样做。
1条答案
按热度按时间4ktjp1zp1#
您需要做的是基于XAMPP数据库创建一个SQLite数据库,使用XAMPP导出XAMPP数据库和SQLite工具(Navicat、DBeaver、DB Browser for SQlite、SQlite Studio),然后可以将生成的文件复制到assets文件夹中。
但是Room在模式期望方面非常严格,并且不支持SQLite列类型的灵活性。因此,建议您首先定义
@Entity
注解类(表和索引)然后提供X1 M1 N1 X注解类,其中X1 M2 N1 X注解的实体参数指定X1 M3 N1 X注解类。在这个阶段,编译项目将为表和索引生成SQL,因此将是Room所期望的表。也许考虑一下这个例子,XAMPP数据库(例子):-
第一步是创建
@Entity
注解类(由于您尚未指定语言,因此使用了Java)。因此,在Android Studio的项目中:-班级联系人:-
班级学生:-
类StudentContactMap(为实现引用完整性而添加的外键):-
此阶段不需要
@Dao
注解接口(可以是抽象类)AllDAO(可以有多个,但为了方便起见,只能有一个):-一个
@Database
注解类,包括获取数据库示例的单例方法,TheDatabase(显然可以用其他名称命名):-编译以生成预期的架构(SQL)
Ctrl + F9将编译项目。从Android Viewjava(生成的)将包含一个与
@Database
注解类同名但后缀为**_Impl* 的类。在这个类中,有一个方法createAllTables,它使用SQL为Room自己创建的每个组件(表索引)创建SQL,即Room期望找到的EXACT模式。
现在,您可以在SQLite工具(使用Navicat)中创建预填充数据库。
对于每个组件(除room_master_table之外的表/索引),将SQL从生成的java复制到空连接/数据库和允许您运行SQL的窗口/视图(您可以运行SQL),例如:-
正在加载数据
切换到XAMPP并将数据库导出为SQL,例如在记事本或任何您可以得到的东西:-
由于表是根据Room的预期创建的,因此所需的全部工作就是使用insert语句填充它们,从而编辑导出SQL:-
只是以防万一,而不是只有
INSERT INTO
的插入更改为INSERT OR IGNORE INTO
。运行SQL的结果为:-
即所有数据均已按预期成功插入。
保存数据库,检查是否只存在一个文件,以及是否没有与数据库同名且后缀为-wal或-shm的文件(可以忽略-journal文件)。
因此,最终结果是一个文件,即数据库,例如:-
然后可以将此文件复制并粘贴到assets文件夹中,例如:-
测试时间
要测试预填充数据库的副本,必须获取@Database注解类的示例,并且必须尝试访问数据库(只有在尝试访问数据库时才会打开数据库,获取示例不会打开数据库)。因此,需要一些活动代码,例如:-
运行时,日志包括:-
成功