全部产品

自定义存储

更新时间:2019-09-09 15:07:48

简介

APDataCenter 对应的默认存储空间为应用沙箱的 /Documents/Preferences 目录。若业务比较独立或数据量比较多,可以自定义存储空间。统一存储模块提供三种自定义存储方式:

APCustomStorage 存储

您可以使用 APCustomStorage 创建一个自己的存储目录。在这个目录里,您可以使用统一存储提供的所有服务,类似 APDataCenter。比如:

  1. APCustomStorage* storage = [APCustomStorage storageInDocumentsWithName:@"Contact"];

就会创建 Documents/Contact 目录。这个目录里同样有存储公共数据的commonPreferences和与用户相关数据的userPreferences。APCustomStorage 与 APDataCenter 类似,业务同样无须关注用户切换。

接口说明

  • (instancetype)storageInDocumentsWithName:(NSString*)name;

    1. 创建路径为 /Documents/name 的自定义存储
  • (id)initWithPath:(NSString*)path;

    1. 在任意指定路径创建自定义存储,通常不需要使用这个方法,使用 storageInDocumentsWithName 即可。使用此接口创建的 APCustomStorage,业务需要自己持有,并且当多个 APCustomStorage path 相同时,会出错。
  • (APBusinessPreferences*)commonPreferences;

    1. 与用户无关的全局存储对象,使用 key-value 方式存取数据。与 APDataCenter 的区别是:在业务的自定义存储空间里,存储 key-value 数据时不需要 business 参数,只需要 key 即可。
  • (APBusinessPreferences*)userPreferences;

    1. 当前登录用户的存储对象,使用 key-value 方式存取数据。不是登录态时,取到的是 nil。与 APDataCenter 的区别是:在业务的自定义存储空间里,存储 key-value 数据时不需要 business 参数,只需要 key 即可。
  • (id)daoWithPath:(NSString*)filePath userDependent:(BOOL)userDependent;

    1. 参考 APDataCenter 的同名接口
  • (APAsyncFileArrayService)asyncFileArrayServiceWithName:(NSString)name userDependent:(BOOL)userDependent capacity:(NSInteger)capacity crypted:(BOOL)crypted;

  1. 创建一个异步的文件阵列管理服务,用于存储互相类似的多条文件记录。会根据服务名单独在数据库文件里建表存储,不放在 key-value 存储的表里。
  2. @param name 服务名,不能为空
  3. @param userDependent 是否与用户相关
  4. @param capacity 容量,超过 capacity 条数据后,会自动清除最早的。capacity <= 0 表示不做数量限制。不是字节容量,是条数。
  5. @param crypted 文件内容是否加密
  6. @return 返回 service 对象,业务自行持有
  • (APObjectArrayService)objectArrayServiceWithName:(NSString)name userDependent:(BOOL)userDependent capacity:(NSInteger)capacity cacheCapacity:(NSInteger)cacheCapacity crypted:(BOOL)crypted;
  1. 创建一个 id 对象存储的阵列管理服务,用于存储类似的 id 对象,支持内存缓存与数据加密。
  2. @param name 服务名,不能为空
  3. @param userDependent 是否与用户相关
  4. @param capacity 容量,超过 capacity 条数据后,会自动清除最早的。capacity <= 0 表示不做数量限制。不是字节容量,是条数。
  5. @param cacheCapacity 内存缓存的条目数容量,cacheCapacity <= 0 时不使用内存缓存。
  6. @param crypted id 对象是否加密
  7. @return 返回 service 对象,业务需要自行持有

APAsyncFileArrayService 存储

  • APAsyncFileArrayService 这个服务是利用数据库提供文件阵列存储功能。当有大量类似文件(比如聊天里的语音)需要存储时,可以使用这个服务。
  • 这个服务需要使用 APCustomStorage 来创建。您需要先创建 APCustomStorage,指定自己的工作目录,再用 APCustomStorage 创建一个 APAsyncFileArrayService,然后使用这个 service 就可以在自己的目录内的数据库文件里写入文件阵列。

接口说明

对于传入了 completion 的异步接口,completion 一定会在主线程回调,可为 nil。

  • (void)writeFile:(NSData)data name:(NSString)name completion:(void(\^)(BOOL result))completion;

    1. 写入文件,文件名是 name,当异步写入完成时,会回调 completionresult 返回是否成功。
  • (void)readFile:(NSString)name completion:(void(\^)(NSData data))completion;

    1. 异步读取文件,文件名是 name,完成时会将文件数据在 completion 返回。
  • (NSData)readFileSync:(NSString)name;

    1. 同步读文件
  • (void)readFilesLike:(NSString)pattern completion:(void(\^)(NSDictionary result))completion;

    1. 使用 sqlite like 功能读取批量数据,result 为文件名与文件数据的字典,异步接口。
  • (void)renameFile:(NSString)name newName:(NSString)newName completion:(void(\^)(BOOL result))completion;

    1. 异步重命名文件
  • (void)removeFile:(NSString*)name;

    1. 异步删除文件
  • (void)removeFilesLike:(NSString*)pattern;

    1. 使用 sqlite like 功能批量删除数据
  • (void)removeAllFiles;

    1. 异步删除所有文件
  • (BOOL)fileExists:(NSString*)name;

    1. 同步接口,文件是否存在
  • (NSArray*)allFileNames;

    1. 同步接口,取所有文件名
  • (NSInteger)fileCount;

    1. 同步接口,文件数目

APObjectArrayService 存储

  • APObjectArrayService 基于 APAsyncFileArrayService 实现,存储支持 NSCoding 协议的 Objective-C 对象,相比 APAsyncFileArrayService,这个服务提供了内存缓存功能。
  • 这个服务同样需要使用 APCustomStorage 来创建。您需要先创建 APCustomStorage,指定自己的工作目录,再用 APCustomStorage 创建一个 APObjectArrayService,然后使用这个 service 就可以在自己的目录内的数据库文件里写入对象阵列。

接口说明

  • (void)setObject:(id)object forKey:(NSString*)key; // 写 IO 是异步的

    1. 设置对象
  • (id)objectForKey:(NSString*)key; // 如果缓存里没有,同步去数据库中读取

    1. 取对象
  • (void)objectForKey:(NSString*)key completion:(void(^)(id object))completion;

    1. 异步读取,读取成功后在主线程调用 completion 返回。
  • (void)objectsForKeyLike:(NSString)pattern completion:(void(^)(NSDictionary result))completion;

    1. 使用 sqlite like 功能读取批量数据,data 为对象名与对象的字典。不检查缓存。
  • (void)removeObjectForKey:(NSString*)key;

    1. 删除数据
  • (void)removeObjectsForKeyLike:(NSString*)pattern;

    1. 使用 sqlite like 功能批量删除数据
  • (void)removeAllObjects;

    1. 删除所有数据
  • (BOOL)objectExistsForKey:(NSString*)key;

    1. 判断某键值数据是否存在
  • (NSArray*)allKeys;

    1. 缓存中所有的 Key
  • (NSInteger)objectCount;

    1. 缓存对象数目