【问题标题】:Deleting records in a sqlite db in iOS won't decrease the database size在 iOS 中删除 sqlite db 中的记录不会减小数据库大小
【发布时间】:2015-06-05 03:41:20
【问题描述】:

我目前正在尝试通过从我的 iOS 应用程序中的 sqlite 数据库中删除记录来减小数据库的大小,但大小将保持不变(与数据库关联的所有文件的大小,即 .sqlite 文件, .sqlite-shm 文件和 .sqlite-wal 文件)。我已经读到这是预期的行为(参考:change sqlite file size after "DELETE FROM table")。此链接建议使用 sqlite “vacuum”工具,这应该清理未使用的内存片段。但是,通过这样做,这会在磁盘内存(更具体地说,.sqlite-wal 文件)上的回滚中分配大量内存。所以这无济于事,因为与数据库关联的文件的总大小没有减少。

我想知道是否有人知道在这种情况下该怎么办?任何帮助表示赞赏。

谢谢

JB

【问题讨论】:

    标签: ios database sqlite memory size


    【解决方案1】:

    您可以在初始化持久存储协调器(通常在 appdelegate 中)(检查堆栈溢出或 google)时禁用预写日志记录 (sqlite-wal)。这意味着对 SQL 数据库所做的任何更改都会立即反映在您设备上的磁盘上,正如您所期望的那样。

    它可能看起来像这样:

     if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:storeURL
                                                         options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES, NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}}
                                                           error:&error])
    

    【讨论】:

    • 我没有使用持久存储协调器。该应用程序正在使用 FMDB 库(它本质上只是原生 sqlite3 库之上的一个包装器)并且该库正在使用预写日志记录支持,并且无法将其关闭。想法?
    • 应该有一个选项可以在配置、初始化或其他地方关闭该功能...
    • FMDB 没有公开这一点。它不允许客户端关闭日志
    • sqlite 是否允许关闭日记功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2023-03-09
    • 2018-06-12
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多