美文网首页
realm 的增删改查

realm 的增删改查

作者: Heikki_ | 来源:发表于2017-01-24 18:07 被阅读465次

首先.导入Realm.framework,
把Realm.framework 拖到"Embedded Binaries"选项中。确认Copy items if needed被选中后,点击Finish按钮;

<h4>一、创建数据库</h4>

这步我是在 appdelegate didFinishLaunchingWithOptions中做的

事实上 并不用创建数据库

//创建数据库
- (void)creatDataBaseWithName:(NSString *)databaseName
{
    NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path = [docPath objectAtIndex:0];
    NSString *filePath = [path stringByAppendingPathComponent:databaseName];
    NSLog(@"数据库目录 = %@",filePath);

    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) {
//        // 这里是设置数据迁移的block
//        if (oldSchemaVersion < currentVersion) {
//        }
//    };
    [RLMRealmConfiguration setDefaultConfiguration:config];
}

二、创建表

每一个继承自RLMObject 的模型可以理解为一个表
.h文件中

#import <Realm/Realm.h>
@interface RLMPt : RLMObject
@property NSString *cName;
@property NSString *cLevel;
@end

.m文件中

#import "RLMPt.h"
@implementation RLMPt
//设置 主键
+ (NSString *)primaryKey {
    return @"cLevel";
}
//设置属性默认值
+ (NSDictionary *)defaultPropertyValues{
    return @{@"cname":@"测试" };
}


//设置忽略属性,即不存到realm数据库中
+ (NSArray<NSString *> *)ignoredProperties {
    return @[@"cLevel"];
}
//楼下两个属性还有些迷糊
//一般来说,属性为nil的话realm会抛出异常,但是如果实现了这个方法的话,就只有name为nil会抛出异常,也就是说现在cover属性可以为空了
+ (NSArray *)requiredProperties {
    return @[@"cLevel"];
}

//设置索引,可以加快检索的速度
+ (NSArray *)indexedProperties {
    return @[@"ID"];
}
@end

三、增删改查

增.改

        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm  beginWriteTransaction];
        RLMPt *pt   =   [RLMPt new];
        pt.cName    =   self.name.text;
        pt.cLevel   =   self.level.text;
  //        [ realm addObject:pt];
        [realm addOrUpdateObject:pt];
    [RLMPt createOrUpdateInRealm:realm withValue:@{@"cName": @"9", @"cLevel": @"1"}];

//根据主键 决定是修改,还是增加
        [ realm commitWriteTransaction];

addOrUpdateObject会去先查找有没有传入的pt相同的主键,如果有,就更新该条数据。这里需要注意,addOrUpdateObject这个方法不是增量更新,所有的值都必须有,如果有哪几个值是null,那么就会覆盖原来已经有的值,这样就会出现数据丢失的问题。
createOrUpdateInRealm:withValue:这个方法是增量更新的,后面传一个字典,使用这个方法的前提是有主键。方法会先去主键里面找有没有字典里面传入的主键的记录,如果有,就只更新字典里面的子集。如果没有,就新建一条记录。

    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    RLMResults<RLMPt *> *pt = [RLMPt allObjects];
    // 删除单条记录
        [realm deleteObject:pt[0]];
    // 删除多条记录
    //    [self.realm deleteObjects:@[pt1.pt2]];
    // 删除所有记录
    //    [realm deleteAllObjects];
    [realm commitWriteTransaction];

    
    RLMResults<RLMPt *> *pt = [RLMPt allObjects];
    //从默认数据库查询所有
    // 使用断言字符串查询
    //    RLMResults<RLMPt *> *pt = [RLMPt objectsWhere:@"cLevel = '1'"];
     NSLog(@"%@",pt);

/* 另一个 demo 中的方法 没有进行验证
    // 使用 NSPredicate 查询
//    NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",
//                         @"棕黄色", @"大"];
//    RLMResults *results = [Dog objectsWithPredicate:pred];
//
//    // 排序名字以“大”开头的棕黄色狗狗
//    RLMResults<Dog *> *sortedDogs = [[Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"] sortedResultsUsingProperty:@"name" ascending:YES];
*/

注意:

1.模型需要继承RLMObject
2.如果是INT 类型 应使用NSNumber<RLMInt>
3.属性类型需要对应正确 string int 不可混淆

reason: '-[__NSCFNumber UTF8String]: unrecognized selector sent to instance 0xb000000000000473'

4.修改过属性类型后,需要删除项目,重新运行.

'Migration is required due to the following errors:
- Property 'HSAccount.personInfoId' has been changed from 'int' to 'string'.'

5.必须设置主键,否则无法更新数据

reason: ''HSAccount' does not have a primary key and can not be updated'

6.设置完主键后需要删除项目,再次运行

reason: 'Migration is required due to the following errors:
- Primary Key for class 'HSAccount has been added.'
reason: 'Migration is required due to the following errors:
- Property 'HSAccount.personInfoId' has been made optional.'

7.主键必须是类的一个属性

reason: 'Primary key property 'hahaha' does not exist on object 'HSAccount''

参考 : http://www.jianshu.com/p/50e0efb66bdf

相关文章

网友评论

      本文标题:realm 的增删改查

      本文链接:https://www.haomeiwen.com/subject/sxozbttx.html