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 支持许多常见的断言:
-
比较操作数(comparison operand)可以是属性名称或者某个常量,但至少有一个操作数必须是属性名称;
-
比较操作符 ==、<=、<、>=、>、!=, 以及 BETWEEN 支持 int, long, long long, float, double, 以及 NSDate 属性类型的比较,比如说 age == 45;
-
相等比较 ==以及!=,比如说[Employee objectsWhere:@"company == %@", company]
-
比较操作符 == and != 支持布尔属性;
-
对于 NSString 和 NSData 属性来说,我们支持 ==、!=、BEGINSWITH、CONTAINS 以及 ENDSWITH 操作符,比如说 name CONTAINS ‘Ja’;
-
字符串支持忽略大小写的比较方式,比如说 name CONTAINS[c] ‘Ja’ ,注意到其中字符的大小写将被忽略;
-
Realm 支持以下复合操作符:“AND”、“OR” 以及 “NOT”。比如说 name BEGINSWITH ‘J’ AND age >= 32;
包含操作符 IN,比如说 name IN {‘Lisa’, ‘Spike’, ‘Hachi’}; -
==、!=支持与 nil 比较,比如说 [Company objectsWhere:@"ceo == nil"]。注意到这只适用于有关系的对象,这里 ceo 是 Company 模型的一个属性。
-
通过 ==, != 进行空值比较,比如说 [Company objectsWhere:@"ceo == nil"]; 注意,Realm 将 nil 视为一个特殊的值而不是“缺失值”,不像 SQL 那样 nil 等于自身。
-
ANY 比较,比如说 ANY student.age < 21
-
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];