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];
}
其他高级用法,还是得根据各公司的项目来进行延伸和拓展了
Realm简单使用小记的更多相关文章
- MagicalRecord简单使用小记
一般采用pod安装,导入框架 #import <CoreData+MagicalRecord.h> - (BOOL)application:(UIApplication *)applica ...
- gulp简单使用小记
npm install --save-dev 写入package.json里 var gulp = require('gulp'); var less = require('gulp-less ...
- Synergy简单使用小记
需求: 两台笔记本用两套键盘鼠标,那体验,糟透了. 怎样才能使得两个主机公用一套鼠标和键盘呢?上网搜索到Synergy这款软件 参考: 具体使用方法参考了这篇博文 基本使用: 这款软件分为服务端和客户 ...
- pop动画库简单使用小记
- (void)animateInView:(UIView *)view{ UIImageView *imageView = [[UIImageView alloc] initWithImage:[U ...
- Shiro - 关于Realm
之前在Authentication和Authorization中也提到Realm. 无论是身份验证还是权限验证,无论数据以什么方式存在,我们都需要访问一些数据并将其转换为Shiro可以识别的格式. 通 ...
- 基于iOS 10、realm封装的下载器
代码地址如下:http://www.demodashi.com/demo/11653.html 概要 在决定自己封装一个下载器前,我本以为没有那么复杂,可在实际开发过程中困难重重,再加上iOS10和X ...
- window nginx 简单搭建服务器访问静态资源
nginx命令: 启动: start nginx 停止:nginx -s stop || nginx -s quit 注:stop是快速停止nginx,可能并不保存相关信息:quit是完整有序的停止 ...
- 【转】Keberos认证原理
前几天在给人解释Windows是如何通过Kerberos进行Authentication的时候,讲了半天也别把那位老兄讲明白,还差点把自己给绕进去.后来想想原因有以下两点:对于一个没有完全不了解Ker ...
- 微信H5支付坑一--手续费未结算
简单随笔小记: 场景:在微信H5支付的过程中,无论怎么支付完成,在微信商户后台查询手续费依然未扣除,当时手续费账户月为5元. 解决方法:起初无论怎么测试都不知道代码到底问题出在哪里了,想一下手续费账户 ...
随机推荐
- Java设计模式(五) 工厂模式
1,定义抽象产品类 package com.pattern.factory; import java.util.ArrayList; public abstract class Pizza { Str ...
- 【POJ 1228】Grandpa's Estate 凸包
找到凸包后暴力枚举边进行$check$,注意凸包是一条线(或者说两条线)的情况要输出$NO$ #include<cmath> #include<cstdio> #include ...
- python之旅3
1 collections系列 方法如下 class Counter(dict): '''Dict subclass for counting hashable items. Sometimes ca ...
- windows系统激活-使用微软官方公布的kms client setup key安装或安装后使用slmgr导入
windows 10各版本: Windows 10 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX Windows 10 Professional N MH37W ...
- linux如何查看系统占用磁盘空间最大的文件及让文件按大小排序
[root@localhost web_bak] find / -type f -size +10G在Linux下如何让文件让按大小单位为M,G等易读格式,S size大小排序. [root@loc ...
- android开发之画图版
android开发之画图版 一.新的开始,也是新的挑战: 开始学习java,除了刚开始的时候有些难,觉得难有些晕,慢慢接触之后也就挺好的了, 学习了4天的安卓开发,完成了一个小程序,收获还是不小的:有 ...
- 71.Android之长连接实现
转载:http://blog.csdn.net/qq_23547831/article/details/51690047 本文中我们将讲解一下App的长连接实现.一般而言长连接已经是App的标配了,推 ...
- java高新技术-反射
一.反射的基石->Class类 定义一个类使用 class 有一个类叫Class Java程序中的各个Java类属于同一类事务,描述这类事物的Java类名就是Class. Person类代表人, ...
- [vijos1002][NOIP2005]过河
Description 给定一条数轴,起点为0,数轴的某些整数点上有石子.每次可以移动的区间为[S,T].求当到达或超过L时,最少踩到的石子数. Input 输入的第一行有一个正整数L(1 <= ...
- 【BZOJ-2836】魔法树 树链剖分
2836: 魔法树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 323 Solved: 129[Submit][Status][Discuss] ...