2.5 KiB
2.5 KiB
#sql
如果需要保留,sql表结构,而只是删掉,其他的表数据,可以参考这个逻辑
public async Task DeleteAllDataAsync<T>() where T : new()
{
await Task.Run(() =>
{
lock (_db)
{
try
{
string tableName = typeof(T).Name;
_db.Execute($"DELETE FROM {tableName}");
}
catch (Exception ex)
{
Debug.LogError($"Error deleting all records from {typeof(T).Name}: {ex.Message}");
throw;
}
}
});
}
如果要删除整个表结构,可以参考drop table删除表结构
需要注意的是,如果只是执行,上述操作,是不会释放空间,和重置id索引的;
1. 重置自增序列计数器:
如果你的表使用了 AUTOINCREMENT 关键字,你可以通过删除并重新创建表来重置序列。这可以通过 DROP TABLE 和 CREATE TABLE 实现。或者,如果不想删除表,可以使用 DELETE 后更新序列计数器:
DELETE FROM sqlite_sequence WHERE name='your_table_name';
这将删除 sqlite_sequence 表中对应表的序列记录,从而重置自增值。
2. 减小数据库文件大小:
删除数据后,可以通过 VACUUM 命令来重建数据库文件,释放未使用的空间:
VACUUM;
VACUUM 命令会清理数据库文件,移除未使用的空间,这可能会帮助减少文件大小,但可能需要一些时间来完成,特别是在大型数据库上。
应用到你的代码中
你可以修改 DeleteAllDataAsync 方法,加入重置序列和压缩数据库的功能:
public async UniTask DeleteAllDataAsync<T>() where T : new()
{
await UniTask.Run(() =>
{
lock (_db)
{
try
{
string tableName = typeof(T).Name;
_db.Execute($"DELETE FROM {tableName}");
// 重置自增序列
_db.Execute($"DELETE FROM sqlite_sequence WHERE name='{tableName}'");
// 压缩数据库
_db.Execute("VACUUM");
}
catch (Exception ex)
{
Debug.LogError($"Error deleting all records from {typeof(T).Name}: {ex.Message}");
throw;
}
}
});
}
这段代码在删除表数据后,会清除自增序列,并尝试压缩数据库文件。注意,频繁执行 VACUUM
可能会影响性能,因此建议根据实际情况适当调用。