Realm-cocoa 学习笔记(二)

Realm模型对象的创建

// Dog的数据模型
@interface Dog : RLMObject
@property NSString *name;
@property NSInteger age;
@end

// (1) 创建对象,然后设置其属性
Dog *myDog = [[Dog alloc] init];
myDog.name = @"大黄";
myDog.age = 10;

// (2) 通过字典创建
Dog *myOtherDog = [[Dog alloc] initWithValue:@{@"name" : @"豆豆", @"age" : @3}];

// (3) 数组中的值必须和数据模型中对应属性的次序相同。
Dog *myThirdDog = [[Dog alloc] initWithValue:@[@"豆豆", @3]];

添加数据

  • 进程中存在多个写入操作的话,那么单个写入操作将会阻塞其余的写入操作。

  • 写入操作最好在一个独立的线程中执行。

  • -[RLMRealm transactionWithBlock:] 以及 -[RLMRealm commitWriteTransaction] 操作将会产生不可忽略的性能消耗,因此应当采用批量化的写入事务,而不是采用多次少量的写入事务。

     // 创建对象
     Person *author = [[Person alloc] init];
     author.name    = @"大卫·福斯特·华莱士";
         
     // 获取默认的 Realm 实例
     RLMRealm *realm = [RLMRealm defaultRealm];
     // 每个线程只需要使用一次即可
     
     // (1).通过事务将数据添加到 Realm 中
     [realm beginWriteTransaction];
     [realm addObject:author];
     [realm commitWriteTransaction];
     
     // 创建对象
     Person *author2 = [[Person alloc] init];
     author2.name    = @"leoo";
     // (2).通过事务将数据添加到 Realm 中
     [realm transactionWithBlock:^{
        [realm addObject:author2];
     }];
         
        // (3).创建并添加
        [realm transactionWithBlock:^{
           [Dog createInRealm:realm withValue:@{@"name": @"大黄", @"age": @1}];
        }];
    

数据更新

  • 内容直接更新

      // 在一个事务中更新对象
      [realm beginWriteTransaction];
      author.name = @"托马斯·品钦";
      [realm commitWriteTransaction];
    
  • 通过主键更新

      // 创建一个带有主键的“书籍”对象,作为事先存储的书籍
      Book *cheeseBook = [[Book alloc] init];
      cheeseBook.title = @"奶酪食谱";
      cheeseBook.price = @9000;
      cheeseBook.id = @1;
      
      // 通过 id = 1 更新该书籍
      [realm beginWriteTransaction];
      [Book createOrUpdateInRealm:realm withValue:cheeseBook];
      [realm commitWriteTransaction];
      
      // 假设带有主键值 `1` 的“书籍”对象已经存在
      [realm beginWriteTransaction];
      [Book createOrUpdateInRealm:realm withValue:@{@"id": @1, @"price": @9000.0f}];
      // 这本书的`title`属性不会被改变
      [realm commitWriteTransaction];
    
  • 键值编码

      RLMResults<Person *> *persons = [Person allObjects];
      [[RLMRealm defaultRealm] transactionWithBlock:^{
        [[persons firstObject] setValue:@YES forKeyPath:@"isFirst"];
        // 将每个人的 planet 属性设置为“地球”
        [persons setValue:@"地球" forKeyPath:@"planet"];
      }];
    

删除数据

  • 删除一个对象

      // 存储在 Realm 中的 cheeseBook 对象
      
      // 在事务中删除一个对象
      [realm beginWriteTransaction];
      [realm deleteObject:cheeseBook];
      [realm commitWriteTransaction];
    
  • 清空数据库 (Realm 文件的大小不会被改变,因为它会保留空间以供日后快速存储数据)

       // 从 Realm 中删除所有数据
      [realm beginWriteTransaction];
      [realm deleteAllObjects];
      [realm commitWriteTransaction];
    

数据查询

  • 普通查询

      RLMResults<Dog *> *dogs = [Dog allObjects]; // 从默认的 Realm 数据库中,检索所有Dog
    
  • 条件查询

      //检索所有棕黄色,并且以“大”开头命名的Dog
      // 使用断言字符串查询
      RLMResults<Dog *> *tanDogs = [Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"];
      
      // 使用 NSPredicate 查询
      NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",
                           @"棕黄色", @"大"];
      tanDogs = [Dog objectsWithPredicate:pred];
    
  • Realm 支持许多常见的断言:

    1. 比较操作数(comparison operand)可以是属性名称或者某个常量,但至少有一个操作数必须是属性名称;

    2. 比较操作符 ==、<=、<、>=、>、!=, 以及 BETWEEN 支持 int, long, long long, float, double, 以及 NSDate 属性类型的比较,比如说 age == 45;

    3. 相等比较 ==以及!=,比如说[Employee objectsWhere:@"company == %@", company]

    4. 比较操作符 == and != 支持布尔属性;

    5. 对于 NSString 和 NSData 属性来说,我们支持 ==、!=、BEGINSWITH、CONTAINS 以及 ENDSWITH 操作符,比如说 name CONTAINS ‘Ja’;

    6. 字符串支持忽略大小写的比较方式,比如说 name CONTAINS[c] ‘Ja’ ,注意到其中字符的大小写将被忽略;

    7. Realm 支持以下复合操作符:“AND”、“OR” 以及 “NOT”。比如说 name BEGINSWITH ‘J’ AND age >= 32;
      包含操作符 IN,比如说 name IN {‘Lisa’, ‘Spike’, ‘Hachi’};

    8. ==、!=支持与 nil 比较,比如说 [Company objectsWhere:@"ceo == nil"]。注意到这只适用于有关系的对象,这里 ceo 是 Company 模型的一个属性。

    9. 通过 ==, != 进行空值比较,比如说 [Company objectsWhere:@"ceo == nil"]; 注意,Realm 将 nil 视为一个特殊的值而不是“缺失值”,不像 SQL 那样 nil 等于自身。

    10. ANY 比较,比如说 ANY student.age < 21

    11. RLMArray 以及 RLMResults 属性支持集合表达式:@count、@min、@max、@sum 以及 @avg,例如 [Company objectsWhere:@"employees.@count > 5"] 用以寻找所有超过 5 名雇员的公司。


查询结果排序

// 名字升序进行排序
RLMResults<Dog *> *sortedDogs = [[Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH '大'"]
                               sortedResultsUsingProperty:@"name" ascending:YES];

参考文档

Realm-cocoa 官方指导文档

posted @ 2016-07-09 14:19  moyazi  阅读(323)  评论(0编辑  收藏  举报