全部产品
云市场
云游戏

APDataCenter

更新时间:2020-08-07 17:30:08

APDataCenter 为统一存储的入口类,为一个单例,可在代码任意地方调用。

  1. [APDataCenter defaultDataCenter]

也可以使用宏。

  1. #define APDefaultDataCenter [APDataCenter defaultDataCenter]

即可实现初始化 APDataCenter。

接口介绍

宏定义

  1. #define APDefaultDataCenter [APDataCenter defaultDataCenter]
  2. #define APCommonPreferences [APDefaultDataCenter commonPreferences]
  3. #define APUserPreferences [APDefaultDataCenter userPreferences]
  4. #define APCurrentVersionStorage [APDefaultDataCenter currentVersionStorage]

常量定义

以下几个事件通知业务代码通常无须关注,但是统一存储会抛出这些通知。

  1. /**
  2. * 前一个用户的数据库文件将要关闭的事件通知
  3. */
  4. extern NSString* const kAPDataCenterWillLastUserResign;
  5. /**
  6. * 用户状态已经发生切换的通知。有可能是 user 变为 nil 了,具体 userId 可以用 currentUserId 来获取。
  7. * 这个通知附加的 object 是个字典,如果不为 nil,里面@"switched"这个键值返回@YES 表示确实发生了用户切换事件。
  8. */
  9. extern NSString* const kAPDataCenterDidUserUpdated;
  10. /**
  11. * 用户并没切换,APDataCenter 重新收到登入事件。会抛这个通知。
  12. */
  13. extern NSString* const kAPDataCenterDidUserRenew;

接口与属性

void APDataCenterLogSwitch(BOOL on);

打开或关闭统一存储的控制台 log,默认为打开。

@property (atomic, strong, readonly) NSString* currentUserId;

获取当前登录用户的 userId。

(NSString*)preferencesRootPath;

获取存储 commonPreferences 和 userPreferences 数据库文件夹的路径。

(void)setCurrentUserId:(NSString*)currentUserId;

设置当前登录的用户 ID,业务代码请不要调用,需要由登录模块调用。设置用户 ID 后,userPreferences 会指向这个用户的数据库。

(void)reset;

完全重置整个统一存储目录,请谨慎使用。

(APSharedPreferences*)commonPreferences;

与用户无关的全局存储数据库。

(APSharedPreferences*)userPreferences;

当前登录用户的存储数据库。不是登录态时,取到的是 nil。

(APSharedPreferences)preferencesForUser:(NSString)userId;

返回指定用户 id 的存储对象,业务层通常使用 userPreferences 方法即可。当有异步存储需要时,防止窜数据,可以使用该方法取特定用户的存储数据库。

(APPreferencesAccessor)accessorForBusiness:(NSString)business;

根据 business 名生成一个存取器,业务层需要自行持有这个对象。使用这个存取器后,访问 KV 存储就不需要再传 business 了。

  1. APPreferencesAccessor* accessor = [[APDataCenter defaultDataCenter] accessorForBusiness:@"aBiz"];
  2. [[accessor commonPreferences] doubleForKey:@"aKey"];
  3. // 等价于
  4. [[[APDataCenter defaultDataCenter] commonPreferences] doubleForKey:@"aKey" business:@"aBiz"];

(APCustomStorage*)currentVersionStorage;

统一存储会维护一个当前版本的数据库,当版本发生升级时,这个数据库会重置。

(id<APDAOProtocol>)daoWithPath:(NSString*)filePath userDependent:(BOOL)userDependent;

从一个配置文件生成 DAO 访问对象。

参数说明

参数 说明
filePath DAO 配置文件的文件路径。在 main bundle 里的文件使用下面方式:
NSString* filePath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"xml"];
userDependent 指定这个 DAO 对象操作哪个数据库。
如果 userDependent=NO,表示与用户无关,那么 DAO 会在 commonPreferences 的数据库文件中建表。
如果 userDependent=YES,那么 DAO 对象会在 userPreferences 的数据库文件中建表。
当切换用户后,后续的 DAO 操作会自动在更换后的用户文件中进行,业务无须关心用户切换。

返回值

DAO 对象。业务不用关心它的类名,只需要使用业务自己定义的 id<AProtocol> 强制转换一下即可。返回的 DAO 对象,在需要时也可以使用 id<APDAOProtocol> 进行转换,调用默认提供的方法。所以自定义的 AProtocol 不要含有 APDAOProtocol 里定义的方法。

(id<APDAOProtocol>)daoWithPath:(NSString)filePath databasePath:(NSString)databasePath;

创建一个维护自己独立数据库文件的 DAO 访问对象,而不使用 APSharedPreferences。使用 daoWithPath:userDependent: 接口创建的 DAO 对象,操作的是 commonPreferencesuserPreferences。这个接口会创建一个 DAO 对象,并且操作的是 databasePath 指定的特定数据库文件,若文件不存在则会创建此文件。可以创建多个 DAO 对象,指定相同的 databasePath

参数说明

参数 说明
filePath daoWithPath:userDependent: 接口。
databasePath DAO 数据库文件的位置,可以传绝对路径,也可传 Documents/XXXX.dbLibrary/Movie/XXX.db 这样的相对路径。

返回值

DAO 对象。