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

来源:互联网 发布:淘宝授权书可以造假吗 编辑:程序博客网 时间:2024/05/29 14:13

一、 目前APP数据存储方式

OS存储方式特点描述iosNSKeyedArchiver一次性编解码,小,笨归档形式存储iosNSUserDefaults设置、属性、用户数据自定义对象需转换ios文件存储子目录文件下存储沙盒读写iosSQLite(FMDB)多线程、轻量灵活C语言API、面向对象iosCoreData同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)查询和属性访问//从默认数据库查询所有的SlideCatRLMResults<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)当有主键的情况下,有以下几个非常好用的APISlideCat *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"}];