20

我正在使用Room Persistence Library 1.1.0/data/data/<package_name>/databases/我可以使用 Android Studio 的设备文件资源管理器找到数据库文件。

room-DAO它包含多个表,我可以使用s毫无问题地访问这些表的内容。但是,使用 , 打开时sqlite-browser,不显示任何表格。

可能是什么原因?是否可以在不从房间切换回旧房间的情况下解决问题SQLiteOpenHelper

4

4 回答 4

61

解决方案

打开此类数据库* 使用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)

这里详细讨论。

于 2018-07-03T06:35:19.997 回答
14

将 AndroidStudio 中的设备文件资源管理器中的所有三个文件复制到您的 PC 目录,然后在 SQLite 的 Db 浏览器 ( http://sqlitebrowser.org ) 中打开 db 文件。确保所有三个文件都在同一个文件夹中。

于 2018-07-13T19:36:14.437 回答
2

您可以使用wal_checkpointpragma 触发检查点,该检查点会将 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模式,我必须启用它。

于 2018-07-10T14:01:25.423 回答
-2

房间数据库导出导入解决方案

我在我的一个项目中遇到了同样的问题,我花了两天时间来解决这个问题。

解决方案

不要为 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'

Github 链接

于 2018-12-24T11:34:59.210 回答