
iOS 键值存储实战指南用 YTKKeyValueStore 优雅搞定缓存、清理与数据迁移【免费下载链接】YTKKeyValueStoreA simple Key-Value storage tool, using Sqlite as backend.项目地址: https://gitcode.com/gh_mirrors/yt/YTKKeyValueStore在实际开发中键值存储Key-Value Storage是 iOS 本地数据持久化最朴素的方案之一而 YTKKeyValueStore 就是一款基于 Sqlite 后端的轻量级键值存储工具用不到 400 行代码把存、取、删、查的体验打磨到了极致。很多朋友对它的认知停留在会调用 putObject / getObjectById 就够了但真正把这款工具用出价值还需要理解它的设计思路并掌握清理、迁移这些进阶姿势。本文以一个小型购物 App 的成长为主线从第一行数据落地讲到版本升级带你完整走一遍键值存储的进阶之路。一、先想清楚键值存储适合什么场景移动端的数据量其实很小单机应用的数据最多上万条带服务端的应用本地只做缓存并不会保存全量数据。既然数据量不大就没必要动用 Core Data 或直接写 SQLite 这类重武器一个接口极简的键值存储工具就足够了。YTKKeyValueStore 恰好满足这一点它以 Sqlite 作为后端Value 统一以 JSON 字符串落库因此天然支持 NSDictionary、NSArray、NSString、NSNumber 四类数据字段增删时旧数据也能正常解析扩展非常友好。在实际开发中它最适合这几类场景用户资料与偏好设置、接口返回数据的本地缓存、搜索历史等轻量记录。接下来我们把故事设定在一个购物 App 里看看从零开始如何用好它。二、数据落地的第一步初始化与写入选择正确的初始化方式打开一个数据库只需要一行代码。默认的initDBWithName:会在 Documents 目录下创建或打开指定的 .sqlite 文件如果你想把数据库放到其他位置可以改用initWithDBWithPath:传入完整路径这个能力在后面的备份恢复中会派上用场。用表隔离数据类型写入之前先要建抽屉——createTableWithName:会创建一张表表就是天然的命名空间建议把不同类型的数据放进不同表互不干扰YTKKeyValueStore *store [[YTKKeyValueStore alloc] initDBWithName:shop.db]; [store createTableWithName:user_table]; // 用户资料 [store createTableWithName:cache_table]; // 接口缓存 [store createTableWithName:cart_table]; // 购物车写入数据时字典、数组用putObject:withId:intoTable:纯字符串和数字则分别用putString:和putNumber:NSDictionary *user {id: 1001, name: 小明, level: 3}; [store putObject:user withId:current_user intoTable:user_table]; [store putString:iPhone withId:last_device intoTable:user_table];值得注意的是写入采用的是 REPLACE 语义同一个 key 重复写入会直接覆盖旧值不需要先查再写天然幂等。 当遇到登录后刷新用户信息这类覆盖场景时直接 put 即可简洁又不易出错。数据顺利落地后下一个问题是如何高效地把它们读回来三、读取的艺术查询、计数与缓存过期读取接口和写入一一对应按 key 取 valueNSDictionary *user [store getObjectById:current_user fromTable:user_table]; NSString *device [store getStringById:last_device fromTable:user_table];用 createdTime 实现缓存过期进阶一点用getYTKKeyValueItemById:拿到的 YTKKeyValueItem 自带createdTime写入时间这正是实现缓存过期的关键。当遇到首页商品列表这类数据时先判断缓存是否新鲜再决定是否请求网络YTKKeyValueItem *item [store getYTKKeyValueItemById:home_list fromTable:cache_table]; if (item [[NSDate date] timeIntervalSinceDate:item.createdTime] 30 * 60) { // 30 分钟内直接用缓存避免频繁请求 NSArray *list item.itemObject; } else { // 过期则重新请求并写入缓存 }计数与全量读取的小妙用此外getCountFromTable:可以统计表内条数适合给购物车加数量角标getAllItemsFromTable:能一次性取出全部数据用来在内存里做本地搜索比如搜索历史联想非常顺手。更贴心的是所有操作内部都通过 FMDatabaseQueue 串行执行你在任意线程调用都不用手动加锁。✅读得顺了另一大主题随之而来——数据该怎么清理才干净利落四、清理的艺术单删、批量删与前缀删按颗粒度选择删除方式清理接口按颗粒度分为四档。删除单条数据用deleteObjectById:fromTable:当遇到购物车批量移除这类场景时相比循环调用单删采用deleteObjectsByIdArray:一次传入 key 数组一条 SQL 就能完成[store deleteObjectsByIdArray:[sku_001, sku_002, sku_005] fromTable:cart_table];前缀删除一键清理同类数据最值得推荐的是前缀删除deleteObjectsByIdPrefix:fromTable:。当遇到用户退出登录、需要清掉所有user_开头的缓存时只需传入前缀底层会通过 LIKE user_% 直接在数据库里完成匹配相比遍历所有 key 再逐个判断效率更高代码也更清爽// 退出登录一键清空该用户的所有本地缓存 [store deleteObjectsByIdPrefix:user_ fromTable:cache_table];如果只想清空表内全部数据保留表结构用clearTable:想连表结构一起重置则用dropTable:删表后再createTableWithName:重建。 按场景选对清理粒度既能避免误删也能省下不必要的开销。数据层的日常增删查改到这里已经完备最后还有一个关乎用户体验的硬仗——版本升级。五、升级不丢数据迁移与备份实战用版本号驱动增量迁移YTKKeyValueStore 没有内置迁移 API但这恰恰不是短板因为 Value 是 JSON 格式新增字段时旧数据依然能解析读取时给缺失字段补个默认值即可多数小版本升级根本不需要迁移。真正需要动手的是字段含义变化或数据结构调整的场景此时可以自己实现一套轻量版本控制。思路很简单把结构版本号作为一条数据存在库里启动时读取比当前版本低就执行增量迁移再更新版本号// 启动时检查版本 NSNumber *version [store getNumberById:schema_version fromTable:meta_table]; if (version.integerValue 2) { [self migrateFromV1ToV2:store]; // 迁移逻辑读旧数据、转换、写回 [store putNumber:2 withId:schema_version intoTable:meta_table]; }需要整体重建时还可以配合isTableExists:判断旧表是否存在先取出数据、处理完毕后再dropTable:重建过程完全可控。文件级备份与恢复至于备份由于 YTKKeyValueStore 的数据库就是一个 .sqlite 文件直接在文件层面复制即可恢复时用initWithDBWithPath:打开备份文件或把备份覆盖回去后重新打开两条路都行得通NSString *docPath NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; NSString *dbPath [docPath stringByAppendingPathComponent:shop.db]; NSString *backupPath [docPath stringByAppendingPathComponent:shop_backup.db]; [[NSFileManager defaultManager] copyItemAtPath:dbPath toPath:backupPath error:nil]; 当遇到大版本升级前先留后路的需求时备份 版本号这套组合拳能让数据安全地完成过渡用户在升级后几乎感知不到变化。结语从会用走向用好回看这条进阶之路先用表即命名空间把数据分门别类再用 createdTime 做精准的缓存过期接着按颗粒度选择合适的清理方式最后用版本号 文件备份实现平滑升级——键值存储虽轻用对了也能撑起可靠的数据层。如果你也想亲手体验这款工具可以 clone https://gitcode.com/gh_mirrors/yt/YTKKeyValueStore 仓库跑一遍示例更多实现细节可以翻阅源码YTKKeyValueStore/Sources/YTKKeyValueStore.m和配套测试YTKKeyValueStoreTests/YTKKeyValueStoreTests.m边读边试理解会更透彻。【免费下载链接】YTKKeyValueStoreA simple Key-Value storage tool, using Sqlite as backend.项目地址: https://gitcode.com/gh_mirrors/yt/YTKKeyValueStore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考