代码之家  ›  专栏  ›  技术社区  ›  Bertram Gilfoyle

android:sqlte用room创建的数据库在用sqlte浏览器打开时不显示表

  •  14
  • Bertram Gilfoyle  · 技术社区  · 8 年前

    我在用 房间持久性库1.1.0 是的。我可以在 /data/data/<package_name>/databases/ 使用android studio的设备文件资源管理器。它包含多个表,我可以使用 room-DAO 但是,当 sqlite-browser ,表示没有表。

    可能是什么原因?不换旧能解决这个问题吗 SQLiteOpenHelper 从房间里?

    4 回复  |  直到 7 年前
        1
  •  32
  •   Bertram Gilfoyle    7 年前

    解决方案

    打开 这样的数据库 *与 sqlite-browser 我是说, 你需要把这三个文件都复制过来 是的。所有的都必须在同一个目录中。

    *如问题所述,数据库存储在多个文件中。


    为什么是三个文件?

    根据文件,从版本开始 1.1.0 ,房间用途 write-ahead logging 作为具有足够RAM并在API级别16或更高级别上运行的设备的默认日志模式。是的 Truncate 对于此版本之前的所有设备。 预写日志 内部结构与 截断 是的。


    查看临时文件 SQLite 时不时地:

    直到版本1.1.0

    enter image description here

    从1.1.0版

    enter image description here


    如果要将日志模式显式更改为 截断 ,你可以这样做。但是, 不建议 因为 WAL 比…好多了 截断 是的。

    public static void initialize(Context context) {
        sAppDatabase = Room.databaseBuilder(
                context,
                AppDatabase.class,
                DATABASE_NAME)
            .setJournalMode(JournalMode.TRUNCATE).build();
    }
    


    是否可以将其移动到单个文件而不更改为 截断 是吗?

    是的,是的。根据数据库查询以下语句。

    pragma wal_checkpoint(full)
    

    这里将详细讨论 here 是的。

        2
  •  7
  •   Bertram Gilfoyle    8 年前

    将androidstudio中的设备文件资源管理器中的所有三个文件复制到您的PC目录中,并在数据库浏览器中为sqlite打开数据库文件( http://sqlitebrowser.org )中。确保三个文件都在同一个文件夹中。

        3
  •  1
  •   bwt    8 年前

    你可以使用 wal_checkpoint 触发pragma checkpoint 这将把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 Statements 有关pragma参数值和结果的详细信息。

    如果wal未启用,则pragma不执行任何操作。 顺便说一下,我用room 1.1.1进行了测试,默认情况下没有使用wal模式,我必须启用它。

        4
  •  0
  •   Bertram Gilfoyle    7 年前

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

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

    解决方案

    不要为Room Library创建多个实例。创建所有问题的多个实例。

    我的应用程序

    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 link

    推荐文章