如果我运行以下命令:
select * from sqlite_master where type = 'table';
我得到了我创建的表,还有像android_metadata
和sqlite_sequence
这样的表。我想在我的应用程序中有一个功能,可以擦除我的表的内容,但我宁愿不触摸数据库为自己创建的表。
我列出所有表,提取它们的名称,过滤列表,并在列表上调用delete from $tablename
:
Future<List<QueryRow>> _getNumberOfExistingTableRows() async {
List<String> sqliteTableNames = ["android_metadata", "sqlite_sequence"];
String selectTablesSql = "select * from sqlite_master where type = 'table';";
final result = await customWriteReturning(selectTablesSql);
result.removeWhere((row) => sqliteTableNames.contains(row.data["name"]));
return result;
}
List<String> tableNameList = _queryRowsToTableNames(await _getNumberOfExistingTableRows());
for (String tableName in tableNameList) {
await customStatement("delete from $tableName;");
}
它是有效的,但如果SQLite在未来的版本中为自己创建另一个表,这也会擦除该表。
使用
SELECT * FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE 'android_%';`
应该做到这一点。