一、项目环境:纯OC
载入Realm:
pod 'Realm'
二、为了方便调用可以写一个Realm类的分类
#import <Foundation/Foundation.h> #import <Realm/Realm.h> @interface RLMRealm (Extension) + (instancetype)shareDataBase; @end
@implementation RLMRealm (Extension) + (instancetype)shareDataBase { static RLMRealm *currentDataBase = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration]; configuration.path = [[[configuration.path stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"Test"] stringByAppendingPathExtension:@"realm"]; currentDataBase = [RLMRealm defaultRealm]; }); return currentDataBase; } @end
三、先看看,外界怎么调用
1、更新RLMObject对象:用含有继承自RLMObject的对象的属性信息的其他类实例来更新RLMObject对象
RLMRealm *realm = [RLMRealm shareDataBase]; [realm beginWriteTransaction]; // TestUser继承自NSObject,其属性上包含了TestUser类需要的属性 TestUserInfo *user = // 这里可以是从网络获取的一个转化后的实例 // TestUser继承自RLMObject [TestUser createOrUpdateInRealm:realm withValue:user]; // 等价于 [realm addOrUpdateObject:user]; [realm commitWriteTransaction];
2、更新RLMObject对象:继承自RLMObject的对象属性有变化需要保存
RLMRealm *realm = [RLMRealm shareDataBase];
[realm beginWriteTransaction];
// TestUser继承自RLMObject
TestUser *user = [TestUser currentUser];
user.phoneNumberChange = NO;
[TestUser createOrUpdateInRealm:realm withValue:user];
[realm commitWriteTransaction];
至于上面的[TestUser currentUser]方法,一般可这样写
+ (TestUser *)currentUser { NSString *phoneNumber = //比如用户存在偏好里的密码,或者九宫格之类的密码 // objectsWhere来自RLMObject的方法,用于某个过滤操作 RLMResults *result = [TestWUser objectsWhere:[NSString stringWithFormat:@"phoneNumber = '%@'",phoneNumber]]; if (result.count) { _currentUser = [result lastObject]; } else _currentUser = [[TestUser allObjectsInRealm:[RLMRealm shareDataBase]] lastObject]; return _currentUser; }
其他操作,用户退出时,得判断下是否正在写入数据,是的话得取消写入操作
[TestUser logout]; RLMRealm *realm = [RLMRealm shareDataBase]; if (realm.inWriteTransaction) { [realm cancelWriteTransaction]; }
四、最后,大体上简单的操作已经完成了,现在最重要的还是在delegate文件里的一些设置了
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 一些其他配置代码...... [self configureRLMDataBase]; // 一些其他配置代码...... }
- (void)configureRLMDataBase { RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; // 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0) config.schemaVersion = SCHEMAVERSION; // 设置闭包,这个闭包将会在打开低于上面所设置版本号的 Realm 数据库的时候被自动调用 config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) { // 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0 if (oldSchemaVersion < SCHEMAVERSION) { [migration enumerateObjects:QHWUser.className block:^(RLMObject *oldObject, RLMObject *newObject) { // 将名字进行合并,存放在 fullName 域中 // newObject[@"testString"] = [NSString stringWithFormat:@""]; newObject[@"zfbfeerate"] = [NSString stringWithFormat:@""]; newObject[@"wxfeerate"] = [NSString stringWithFormat:@""]; }]; } }; // 告诉 Realm 为默认的 Realm 数据库使用这个新的配置对象 [RLMRealmConfiguration setDefaultConfiguration:config]; // 现在我们已经告诉了 Realm 如何处理架构的变化,打开文件之后将会自动执行迁移 [RLMRealm defaultRealm]; }
其他高级用法,还是得根据各公司的项目来进行延伸和拓展了