zoukankan      html  css  js  c++  java
  • 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];
        
    }

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

  • 相关阅读:
    Educational Codeforces Round 22 C. The Tag Game
    Codeforces Round #421 (Div. 1) B. Mister B and PR Shifts(技巧)
    Codeforces Round #422 (Div. 2) D. My pretty girl Noora
    Codeforces Round #422 (Div. 2) C. Hacker, pack your bags!
    hdu3756(三分)
    hihocoder1496(高维前缀和)
    AOJ731(不等式)
    UVALive7042(博弈论)
    Codeforces 284E(概率)
    hdu4778(状态压缩dp)
  • 原文地址:https://www.cnblogs.com/songxing10000/p/5511114.html
Copyright © 2011-2022 走看看