Realm移动应用数据库使用-IOS

一、 目前APP数据存储方式

OS 存储方式 特点 描述
ios NSKeyedArchiver 一次性编解码,小,笨 归档形式存储
ios NSUserDefaults 设置、属性、用户数据 自定义对象需转换
ios 文件存储 子目录文件下存储 沙盒读写
ios SQLite(FMDB) 多线程、轻量灵活 C语言API、面向对象
ios CoreData 同FMDB 关联表操作简单


二、Realm介绍

主流框架 ios:SQLite、FMDB、CoreData
性能 MVCC数据库,API调用方法简化,相较传统DB(链接 - 查询 - 命中 - 内存拷贝 - 对象序列化)的复杂过程,不是在SQLite基础上的ORM,数据查询引擎,realm速度快一个量级(基于内存映射的Zero-Copy技术)。而且内部采用了类似git的对象版本管理机制,多线程并发操作,自动化处理存储冲突。易于移植,支持JSON,数据变更通知等高级特性
可视化 ios:Realm Browser(mac):Tools->Generate Demo Database;正式,手动安装,打开 plugin/RealmPlugin.xcodeproj并编译
安全性 安全性,支持加密,格式化查询,流式api


三、IOS应用集成Realm

1、集成环境 Android Studio >= 1.5.1
JDK version >=7.
Android API >=9(Android 2.3)
2、文件配置 在project的build中加入依赖
  dependencies {classpath "io.realm:realm-gradle-plugin:2.1.2"}
在module的build添加
apply plugin: 'realm-android'

3、初始化	- (void)creatDataBaseWithName:(NSString *)databaseName{   
    NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [docPath objectAtIndex:0];
    NSString *filePath = [path stringByAppendingPathComponent:databaseName];
    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    config.fileURL = [NSURL URLWithString:filePath];
    config.objectClasses = @[MyClass.class, MyOtherClass.class];
    config.readOnly = NO;
    int currentVersion = 1.0;
    config.schemaVersion = currentVersion;
    config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) {
        if (oldSchemaVersion < currentVersion) {}// block回调处理数据迁移 };
    [RLMRealmConfiguration setDefaultConfiguration:config];}
4、数据模型	#import <Realm/Realm.h>
@interface SlideCat : RLMObject
@property NSInteger      index;//索引,位置
@property NSString       *uv;//纹理贴图
@property NSString       *sound;//音效
RLM_ARRAY_TYPE(SlideCat) //
@end
@implementation SlideCat
+ (NSString *)primaryKey {
    return @"index";// 主键
}
+ (NSDictionary *)defaultPropertyValues{
    return @{@"uv":@"blackcat.png" };//设置属性默认值
}
+ (NSArray *)requiredProperties {
    return @[@"uv",@"sound"];//避免uv、sound为nil会抛出异常
}
+ (NSArray *)indexedProperties {
    return @[@"index"];//设置索引,可以加快检索的速度
}
@end
/**
*增
*/
//(1)事务操作
SlideCat *cat= [[SlideCat alloc] init];
cat.index = 1;
cat.uv= @"blackcat.png";
cat.sound = @"angry.mp4";
//事务操作
[realm beginWriteTransaction];
[realm addObject:cat];
[realm commitWriteTransaction];

//(2)Realm 采用了 MVCC 设计架构,读取操作并不会因为写入事务正在进行而受到影响。可采用批量化的写入事务,若多个线程同时执行写入操作,则每个线程单独执行事务操作。
SlideCat *cat= [[SlideCat alloc] init];
cat.index = 1;
cat.uv= @"blackcat.png";
cat.sound = @"angry.mp4";
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm transactionWithBlock:^{
            [realm addObject: cat];
        }];
    });

/**
*查
*/
//(1)查询和属性访问
//从默认数据库查询所有的SlideCat
RLMResults<SlideCat *> *cats= [SlideCat allObjects];

// 使用 NSPredicate 查询所有生气的黑猫
NSPredicate *pred = [NSPredicate predicateWithFormat:@"uv= %@ AND sound BEGINSWITH %@",@"blackcat.png",@"angry"];
RLMResults *results = [SlideCat objectsWithPredicate:pred];

// 根据位置索引,排序所有生气的黑猫
RLMResults<SlideCat *> *sortedCats = [[SlideCat objectsWhere:@"uv= 'blackcat' AND sound BEGINSWITH 'angry'"] sortedResultsUsingProperty:@"index" ascending:YES];
//(2)链式查询:Realm 查询引擎一个特性就是它能够通过非常小的事务开销来执行链式查询(chain queries)
RLMResults<SlideCat *> *cats= [SlideCat objectsWhere:@"uv= blackcat.png"];

RLMResults<SlideCat *> *catResults= [cats objectsWhere:@"sound BEGINSWITH 'angry'"];

/**
*删
*/
SlideCat *cat= [[SlideCat alloc] init];
cat.index = 1;
cat.uv= @"blackcat.png";
cat.sound = @"angry.mp4";
[realm beginWriteTransaction];
// 删除单条记录
[realm deleteObject:cat];
// 删除多条记录
[realm deleteObjects:catResult];
// 删除所有记录
[realm deleteAllObjects];
[realm commitWriteTransaction];

/**
*改
*/
//(1)当没有主键的情况下,需要先查询,再修改数据。
NSPredicate *pred = [NSPredicate predicateWithFormat:@"index= %d",1];
[realm addOrUpdateObject:cat];

//(2)当有主键的情况下,有以下几个非常好用的API
SlideCat *cat= [[SlideCat alloc] init];
cat.index = 1;
cat.uv= @"blackcat.png";
cat.sound = @"smile.mp4";
[realm addOrUpdateObject:cat];

[SlideCat createOrUpdateInRealm:realm withValue:@{@"index": @1, @"sound": @"smile.mp4",@"uv":@"blackcat.png"}];


猜你喜欢

转载自blog.csdn.net/yeyu_wuhen/article/details/78262310