SQLdelight删除所有表

问题描述

我在Kotlin / Native项目(iOS和Android)中使用sqlDelight,并且我正在寻找删除DB(所有表)的最佳方法用户案例:使用从应用程序注销。因此,我一直在寻找一种从所有表中删除数据的方法。 到目前为止,我已经尝试过了,但是我无法访问sqlite_master表:

dropAllTables:
  PRAGMA writable_schema = 1;
  DELETE FROM sqlite_master WHERE type IN ('table','index','trigger');
  PRAGMA writable_schema = 0;
  VACUUM;
  PRAGMA INTEGRITY_CHECK;

错误No table found with name sqlite_master

sqlDeligth删除所有表的最佳方法是什么?(我想避免在每个表中写入DROP TABLE

此外,upsert {似乎也不适合我。.不知道如何为其提供label

解决方法

如果您不关心dB中的任何内容并希望将其完全清除,则可以关闭连接并删除文件,下次打开连接时,它将重新创建数据库

,

由于我想在数据库中保留一些不变的数据,因此original解决方案将无法工作,因此我接下来要做:

  1. 保留对SqlDriver
  2. 的引用
  3. 删除必需表
val cursor = sqlDriver.executeQuery(
            null,"SELECT name FROM sqlite_master WHERE type = 'table' " +
                    //system tables
                    "AND name NOT LIKE '%sqlite%' " +
                    "AND name NOT LIKE '%metadata%' " +
                    "AND name NOT LIKE '%ios%' " +
                    "AND name NOT LIKE '%android%' " +
                    //immutable tables
                    "AND name != 'MySomeTalbe';",0
        )
        while (cursor.next()) {
            cursor.getString(0)?.let {
                sqlDriver.execute(null,"DELETE FROM $it",0)
            }
        }

注意:这是Kotlin / Native项目