十一岁的加重songxing10000…… ------ 回到博主首页

Realm简单使用小记

一、项目环境:纯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];
    
}

其他高级用法,还是得根据各公司的项目来进行延伸和拓展了

 

posted @ 2016-05-20 10:09  songxing10000  阅读(541)  评论(0编辑  收藏  举报