我正在使用Room Persistence Library 1.1.0。/data/data/<package_name>/databases/
我可以使用 Android Studio 的设备文件资源管理器找到数据库文件。
room-DAO
它包含多个表,我可以使用s毫无问题地访问这些表的内容。但是,使用 , 打开时sqlite-browser
,不显示任何表格。
可能是什么原因?是否可以在不从房间切换回旧房间的情况下解决问题SQLiteOpenHelper
?
我正在使用Room Persistence Library 1.1.0。/data/data/<package_name>/databases/
我可以使用 Android Studio 的设备文件资源管理器找到数据库文件。
room-DAO
它包含多个表,我可以使用s毫无问题地访问这些表的内容。但是,使用 , 打开时sqlite-browser
,不显示任何表格。
可能是什么原因?是否可以在不从房间切换回旧房间的情况下解决问题SQLiteOpenHelper
?
打开此类数据库* 使用sqlite-browser
,您需要复制所有三个文件。所有必须在同一个目录中。
* 如问题中所述,数据库存储在多个文件中。
根据文档,从 version 开始1.1.0
,Roomwrite-ahead logging
用作具有足够 RAM 并在 API 级别 16 或更高版本上运行的设备的默认日志模式。在此版本之前,它Truncate
适用于所有设备。write-ahead logging
与 相比具有不同的内部结构Truncate
。
看看SQLite
现在使用的文件临时文件:
直到版本 1.1.0
从版本 1.1.0
如果您想将日志模式显式更改为Truncate
,您可以这样做。但是,不推荐,因为WAL
它比Truncate
.
public static void initialize(Context context) {
sAppDatabase = Room.databaseBuilder(
context,
AppDatabase.class,
DATABASE_NAME)
.setJournalMode(JournalMode.TRUNCATE).build();
}
Truncate
?是的。针对数据库查询以下语句。
pragma wal_checkpoint(full)
在这里详细讨论。
将 AndroidStudio 中的设备文件资源管理器中的所有三个文件复制到您的 PC 目录,然后在 SQLite 的 Db 浏览器 ( http://sqlitebrowser.org ) 中打开 db 文件。确保所有三个文件都在同一个文件夹中。
您可以使用wal_checkpoint
pragma 触发检查点,该检查点会将 WAL 文件事务移回数据库。
theRoomDb.query("pragma wal_checkpoint(full)", null)
或者
// the result
// contains 1 row with 3 columns
// busy, log, checkpointed
Cursor cursor = theRoomDb.query("pragma wal_checkpoint(full)", null)
有关 pragma 参数值和结果的更多详细信息,请参阅PRAGMA 语句。
如果未启用 WAL,则 pragma 什么也不做。顺便说一下,我用Room 1.1.1测试,默认没有使用WAL模式,我必须启用它。
房间数据库导出导入解决方案
我在我的一个项目中遇到了同样的问题,我花了两天时间来解决这个问题。
解决方案
不要为 Room 库创建多个实例。多个实例造成所有问题。
我的应用程序
class MyApplication: Application()
{
companion object {
lateinit var mInstanceDB: AppDatabase
}
override fun onCreate() {
super.onCreate()
mInstanceDB = AppDatabase.getInstance(this)
}
}
应用数据库
fun getInstance(context: Context): AppDatabase
{
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.java, "database").allowMainThreadQueries().build()
return sInstance!!
}
}
现在在任意数量的活动或片段中使用这个实例,就像这样
{
var allcustomer = MyApplication.mInstanceDB.customerDao.getAll()
}
导出和导入使用这个库
implementation 'com.ajts.androidmads.sqliteimpex:library:1.0.0'