Realm 在 iOS 中的使用方法及注意事項

Objective?C版本的 Realm 能夠讓您以一種安全、耐用以及迅捷的方式來高效地編寫應用的數據模型層

數據模型(Model)

Realm數據模型是基于標準 Objective?C 類來進行定義的,使用屬性來完成模型的具體定義。通過簡單的繼承 RLMObject 或者一個已經存在的模型類,您就可以創建一個新的 Realm 數據模型對象。
Realm模型對象在形式上基本上與其他 Objective?C 對象相同 - 您可以給它們添加您自己的方法(method)和協議(protocol),和在其他對象中使用類似。
您只需要為對象的類型列表添加目標類型的屬性,或者 RLMArray,就可以創建數據關系(relationship)和嵌套數據結構(nested data structure)。

#import <Realm/Realm.h>

@class Person;

// 狗狗的數據模型
@interface Dog : RLMObject
@property NSString *name;
@property Person   *owner;
@end
RLM_ARRAY_TYPE(Dog) // 定義RLMArray<Dog>

// 狗狗主人的數據模型
@interface Person : RLMObject
@property NSString      *name;
@property NSDate        *birthdate;
@property RLMArray<Dog> *dogs;
@end
RLM_ARRAY_TYPE(Person) // 定義RLMArray<Person>

支持的類型

Realm支持以下的屬性類型:BOOL int NSInteger long float double NSString NSDate NSData 以及 被特殊類型標記的 NSNumber 。
您可以使用 RLMArray<Object *><Object>RLMObject 的子類來建立諸如一對多、一對一之類的關系模型。
在 Xcode 7 以及之后的版本中,RLMArray支持編譯時的 Objective?C 泛型(generics)。下面是不同屬性定義方法的意義以及用途:

// RLMArray: 屬性類型。
// <Object *>: 屬性的特別化(generic specialization),這可以阻止在編譯時使用錯誤對象類型的數組。
// <Object>: 此RLMArray遵守的協議,可以讓 Realm 知曉如何在運行時確定數據模型的架構。

關系(Relationships)

RLMObject 能夠借助 RLMObject 以及 RLMArray 屬性來和另一個 RLMObject 建立聯系。 RLMArray 的接口和 NSArray 非常類似,在 RLMArray 中的對象能夠通過索引下標(indexed subscripting)進行訪問。 與 NSArray 所不同的是,RLMArray 的類型是固定的,其中只能存放簡單的 RLMObject 子類類型。 要了解更詳細的信息,請參閱 RLMArray
假設現在您已經定義好了 Person 數據模型(見上文),讓我們創建另一個名為 Dog 的數據模型:

// Dog.h
@interface Dog : RLMObject
@property NSString *name;
@end

對一(To-One)關系

對于多對一(many-to-one)或者一對一(one-to-one)關系來說,只需要聲明一個 RLMObject 子類類型的屬性即可:

// Dog.h
@interface Dog : RLMObject
// 其余屬性聲明...
@property Person *owner;
@end

您可以非常簡單的通過這個屬性完成關系的綁定:

Person *jim = [[Person alloc] init];
Dog *rex = [[Dog alloc] init];
rex.owner = jim;

當使用 RLMObject 屬性的時候,您可以通過正常的屬性訪問語法來訪問嵌套屬性。比如說,rex.owner?.address.country 會依次讀取對象的屬性,然后自動從 Relam 中匹配所需的每一個對象。

對多(To-Many)關系

通過 RLMArray 類型的屬性您可以定義一個對多關系。RLMArray 中可以包含簡單類型的 RLMObject ,其接口與 NSMutableArray 非常類似。

RLMArray 可能會包含多個相同 Realm 對象的引用,即便對象帶有主鍵也是如此。例如,您或許會創建一個空的 RLMArray ,然后連續三次向其中插入同一個對象;當使用 0、1、2 的索引來訪問元素的時候,RLMArray 將會返回對應的對象,而所返回的這三個對象都是同一個對象。

如果要給我們的 Person 數據模型添加一個 “dogs” 屬性,以便能夠和多個 “dogs” 建立關系,也就是表明一個「人」可以養多條「狗」,那么我們首先需要定義一個 RLMArray<Dog> 類型。通過對應數據模型接口文件下的宏命令即可完成:

//Dog.h
@interface Dog : RLMObject
// 屬性聲明...
@end

**
RLM_ARRAY_TYPE(Dog) // 定義一個 RLMArray<Dog> 類型
RLM_ARRAY_TYPE 宏創建了一個協議,從而允許 RLMArray<Dog> 語法的使用。如果該宏沒有放置在模型接口的底部的話,您或許需要提前聲明該模型類。
**
接下來您就能定義RLMArray<Dog>類型的屬性了:

```objc
// Person.h
@interface Person : RLMObject
// 其余的屬性聲明...
@property RLMArray<Dog *><Dog> *dogs;
@end

您可以和之前一樣,對 RLMArray 屬性進行訪問和賦值:

// jim 是 rex 以及所有名字叫“Fido”的狗狗的主人
RLMResults<Dog *> *someDogs = [Dog objectsWhere:@"name contains 'Fido'"];
[jim.dogs addObjects:someDogs];
[jim.dogs addObject:rex];

注意:雖然可以給 RLMArray 屬性賦值為 nil,但是這僅用于“清空”數組,而不是用以移除數組。這意味著您總是可以向一個 RLMArray 屬性中添加對象,即使其被置為了 nil。
RLMArray 屬性將確保其當中的插入次序不會被擾亂。

這里需要強調的是嵌套數據結構和數據關系的使用,即對 RLMArray 的使用。RLMArray 是Realm的數組,只能存放對象類型的數據。在使用 RLMArray 時需要注意:RLM_ARRAY_TYPE 宏創建了一個協議,從而允許 RLMArray<Dog> 語法的使用。如果該宏沒有放置在模型接口的底部的話,您或許需要提前聲明該模型類。

實用例

#import <Realm/Realm.h>

@interface BKUserPayWay : RLMObject

@property NSString *userPayWayName;
@property NSString *userPayWayValue;

@end
RLM_ARRAY_TYPE(BKUserPayWay)  //定義RLMArray< BKUserPayWay >

@interface BKUserStatusInfo : RLMObject

@property NSString * userNum;
@property NSString * userPwd;
@property NSString * deveiceToken;

//有糖小店支付 信息
@property NSString *  userSecretKey;
@property NSString *  userValidTime;
@property RLMArray <BKUserPayWay *><BKUserPayWay>*  userPayWays;

反向關系(Inverse Relationship)

鏈接是單向性的。因此,如果對多關系屬性 Person.dogs 鏈接了一個 Dog 實例,而這個實例的對一關系屬性 Dog.owner 又鏈接到了對應的這個 Person 實例,那么實際上這些鏈接仍然是互相獨立的。為 Person 實例的 dogs 屬性添加一個新的 Dog 實例,并不會將這個 Dog 實例的 owner 屬性自動設置為該 Person 。但是由于手動同步雙向關系會很容易出錯,并且這個操作還非常得復雜、冗余,因此 Realm 提供了 “鏈接對象 (linking objects)” 屬性來表示這些反向關系。

借助鏈接對象屬性,您可以通過指定的屬性來獲取所有鏈接到指定對象的對象。例如,一個 Dog 對象可以擁有一個名為 owners 的鏈接對象屬性,這個屬性中包含了某些 Person 對象,而這些 Person 對象在其 dogs 屬性中包含了這一個確定的 Dog 對象。您可以將 owners 屬性設置為 RLMLinkingObjects 類型,然后重寫 +[RLMObject linkingObjectsProperties] 來指明關系,說明 ownders 中包含了 Person 模型對象。

@interface Dog : RLMObject
@property NSString *name;
@property NSInteger age;
@property (readonly) RLMLinkingObjects *owners;
@end

@implementation Dog
+ (NSDictionary *)linkingObjectsProperties {
    return @{
        @"owners": [RLMPropertyDescriptor descriptorWithClass:Person.class propertyName:@"dogs"],
    };
}
@end

可空屬性(Optional Properties)

通常情況下,NSString *NSData * 以及 NSDate * 屬性可以設置為 nil。如果你不需要實現此功能,你可以重寫您的 RLMObject 子類的 +requiredProperties
方法。

比如對于以下的模型定義來說,如果嘗試給 name 屬性設置為 nil
將會拋出一個異常,但是將 birthday 屬性設置為 nil
卻是允許的:

@interface Person : RLMObject
@property NSString *name;
@property NSDate *birthday;
@end

@implementation Person
+ (NSArray *)requiredProperties {
    return @[@"name"];
}
@end

存儲可空數字目前已經可以通過 NSNumber * 屬性完成。
由于 Realm 對不同類型的數字采取了不同的存儲格式,因此設置可空的數字屬性必須是 RLMIntRLMFloatRLMDouble 或者 RLMBool 類型。所有賦給屬性的值都會被轉換為其特定的類型。

請注意:NSDecimalNumber 的值只能分配給類型為 RLMDouble 的 Realm 屬性,此外 Realm 將會存儲近似于雙精度浮點的數值,而不是存儲基本的十進制數值。

比如說,如果我們存儲一個用戶的年齡(age)而不是存儲他們的生日,同時還要允許當您不知道該用戶的年齡的時候將 age 屬性設置為 nil

@interface Person : RLMObject
@property NSString *name;
@property NSNumber<RLMInt> *age;
@end

@implementation Person
+ (NSArray *)requiredProperties {
    return @[@"name"];
}
@end

RLMProperty 的子類屬性始終都可以為 nil,因此這些類型不能夠放在 requiredProperties 中,并且 RLMArray 不支持存儲 nil 值。

簡單說明

這個表格提供了關于聲明模型屬性的簡易參考:

類型 非可選值形式 可選值形式
Bool @property BOOL value; @property NSNumber<RLMBool> *value;
Int @property int value; @property NSNumber<RLMInt> *value;
Float @property float value; @property NSNumber<RLMFloat> *value;
Double @property double value; @property NSNumber<RLMDouble> *value;
String @property NSString *value; @property NSString *value;
Data @property NSData *value; @property NSData *value;
Date @property NSDate *value; @property NSDate *value;
Object n/a: 必須是可選值 @property Object *value;
List @property RLMArray<Object *><Object> *value; n/a: 必須是非可選值
LinkingObjects @property (readonly) RLMLinkingObjects<Object *> *value; n/a: 必須是非可選值
  1. Objective?C 引用類型的必需屬性必須要聲明在聯合體當中:
@implementation MyModel
+ (NSArray *)requiredProperties {
    return @[@"value"];
}
@end
  1. 鏈接對象屬性必須連帶 +linkingObjectsProperties 方法一同聲明:
@implementation MyModel
+ (NSDictionary *)linkingObjectsProperties {
    return @{ @"property": [RLMPropertyDescriptor descriptorWithClass:Class.class propertyName:@"link"] };
}
@end

屬性特性(attributes)

注意由于 Realm 在自己的引擎內部有很好的語義解釋系統,所以 Objective?C 的許多屬性特性將被忽略,如 nonatomic, atomic, strong, copyweak 等。 因此為了避免誤解,我們推薦您在編寫數據模型的時候不要使用任何的屬性特性。 當然,如果您已經設置了這些屬性特性,那么在 RLMObject 對象被寫入 Realm 數據庫前,這些特性會一直生效。 無論 RLMObject 對象是否受到 Realm 管理,您為其編寫的自定義 gettersetter 方法都能正常工作。
如果您在 Swift 中使用 Objective-C 版本的 Realm 的話,模型的屬性前面需要加上 dynamic var,這是為了讓這些屬性能夠被底層數據庫數據所訪問。

索引屬性(Indexed Properties)

重寫 +indexedProperties
方法可以為數據模型中需要添加索引的屬性建立索引:

@interface Book : RLMObject
@property float price;
@property NSString *title;
@end

@implementation Book
+ (NSArray *)indexedProperties {
  return @[@"title"];
}
@end

Realm 支持字符串、整數、布爾值以及 NSDate 屬性作為索引。
對屬性進行索引可以減少插入操作的性能耗費,加快比較檢索的速度(比如說 = 以及 IN 操作符)。

屬性默認值

重寫+defaultPropertyValues
可以每次在對象創建之后為其提供默認值。

@interface Book : RLMObject
@property float price;
@property NSString *title;
@end

@implementation Book
+ (NSDictionary *)defaultPropertyValues {
    return @{@"price" : @0, @"title": @""};
}
@end

對象的自更新特性

RLMObject 實例是底層數據的動態表現,其會進行自動更新,這意味著對象不需要進行刷新。修改某個對象的屬性會立刻影響到其他所有指向同一個對象的實例。

Dog *myDog = [[Dog alloc] init];
myDog.name = @"小白";
myDog.age = 1;

[realm transactionWithBlock:^{
  [realm addObject:myDog];
}];

Dog *myPuppy = [[Dog objectsWhere:@"age == 1"] firstObject];
[realm transactionWithBlock:^{
  myPuppy.age = 2;
}];

myDog.age; // => 2

RLMObject 的這個特性不僅讓 Realm 保證速度和效率,它同時還讓代碼更加簡潔、更為靈活。比如說,如果您的 UI 代碼是基于某個特定的 Realm 對象來現實的,那么在觸發 UI 重繪之前,您不用擔心數據的刷新或者重新檢索等問題。
您也可以查看 Realm 通知 一節以確認 Realm 數據何時被更新,比如說由此來決定應用 UI 何時需要被更新。此外,還可以使用 鍵值編碼,當某個 RLMObject 的特定屬性發生更新時去發送通知。

主鍵(Primary Keys)

重寫 +primaryKey
可以設置模型的主鍵。聲明主鍵之后,對象將允許進行查詢,并且更新速度更加高效,而這也會要求每個對象保持唯一性。 一旦帶有主鍵的對象被添加到 Realm 之后,該對象的主鍵將不可修改。

@interface Person : RLMObject
@property NSInteger id;
@property NSString *name;
@end

@implementation Person
+ (NSString *)primaryKey {
    return @"id";
}
@end

忽略屬性(Ignored Properties)

重寫 +ignoredProperties
可以防止 Realm 存儲數據模型的某個屬性。Realm 將不會干涉這些屬性的常規操作,它們將由成員變量(ivar)提供支持,并且您能夠輕易重寫它們的 settergetter

@interface Person : RLMObject
@property NSInteger tmpID;
@property (readonly) NSString *name; // 只讀屬性將被自動忽略
@property NSString *firstName;
@property NSString *lastName;
@end

@implementation Person
+ (NSArray *)ignoredProperties {
    return @[@"tmpID"];
}
- (NSString *)name {
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
}
@end

忽略屬性的行為與 Objective-C 或者 Swift 類當中的普通對象相似。它們并不支持任何一種 Realm 特定的功能。例如,無法通過查詢來檢索忽略屬性,也無法實現自動更新,即便另一個相同對象的實例的忽略屬性值發生了變更。此外忽略屬性發生更改的時候也不會觸發通知,盡管仍然可以使用 KVO 來實現簡直觀察。

模型繼承

Realm 允許模型能夠生成更多的子類,也允許跨模型進行代碼復用,但是由于某些 Cocoa 特性使得運行時中豐富的類多態無法使用。以下是可以完成的操作:
父類中的類方法,實例方法和屬性可以被它的子類所繼承
子類中可以在方法以及函數中使用父類作為參數

以下是不能完成的:
多態類之間的轉換(例如子類轉換成子類,子類轉換成父類,父類轉換成子類等)
同時對多個類進行檢索
多類容器 (RLMArray 以及 RLMResults)。

向 Realm 中增加此特性已經在規劃當中,并且我們暫時提供了一些代碼示例,以便能夠對更常見的模式進行處理。

另外,如果您的代碼實現允許的話,我們建議您使用以下模式,也就是使用類組合模式來構建子類,以便能夠包含其他類中的相關邏輯:

// 基礎模型
@interface Animal : RLMObject
@property NSInteger age;
@end
@implementation Animal
@end

// 包含有 Animal 的模型
@interface Duck : RLMObject
@property Animal *animal;
@property NSString *name;
@end
@implementation Duck
@end

@interface Frog : RLMObject
@property Animal *animal;
@property NSDate *dateProp;
@end
@implementation Frog
@end

// 用法
Duck *duck =  [[Duck alloc] initWithValue:@{@"animal" : @{@"age" : @(3)}, @"name" : @"Gustav" }];

集合

Realm 擁有一系列能夠幫助表示一組對象的類型,我們稱之為「Realm 集合」:
1、RLMResults
類,表示從檢索 中所返回的對象集合。
2、RLMArray
類,表示模型中的對多關系
3、RLMLinkingObjects
類,表示模型中的反向關系
4、RLMCollection
協議,定義了所有 Realm 集合所需要遵守的常用接口。

Realm 集合實現了 RLMCollection 協議,這確保它們能夠保持一致。這個協議繼承自 NSFastEnumeration,因此它應當與其他 Foundation 當中的集合用法一致。 其他常用的 Realm 集合 API 也在這個協議當中進行了聲明,例如其中包括檢索、排序以及聚合操作。 RLMArray 擁有額外的修改操作,這些操作不在協議接口當中有定義,例如添加和刪除對象。
使用 RLMCollection 協議,您可以編寫能夠操作任意 Realm 集合的泛型代碼:

@implementation MyObject
- (void)operateOnCollection:(id<RLMCollection>)collection {
  // collection 既可以是 RLMResults,也可以是 RLMArray
  NSLog(@"對集合 %@s 進行操作", collection.objectClassName);
}
@end

對象存儲

對對象的所有更改(添加,修改和刪除)都必須通過寫入事務(transaction)完成。

Realm 的對象可以被實例化并且作為unmanaged對象使用(也就是還未添加到 Realm 數據庫中的對象),和其他常規Objective?C對象無異。
如果您想要在多個線程中共享對象,或者在應用重啟后重復使用對象,那么您必須將其添加到 Realm 數據庫中——這個操作必須在寫入事務中完成。
因為寫入事務將會產生不可忽略的性能消耗,因此你應當檢視你的代碼以確保減少寫入事務的次數。
由于寫入事務像其余硬盤讀寫操作一樣,會出現失敗的情況,因此 -[RLMRealm transactionWithBlock:] 以及 -[RLMRealm commitWriteTransaction] 可以選擇加上 NSError 指針參數 因此你可以處理和恢復諸如硬盤空間溢出之類的錯誤。此外,其他的錯誤都無法進行恢復。簡單起見,我們的代碼示例并不會處理這些錯誤,但是您應當在您應用當中注意到這些問題。

創建對象

當定義完數據模型之后,您可以將您的 RLMObject 子類實例化,然后向 Realm 中添加新的實例。我們以下面這個簡單的模型為例:

// 狗狗的數據模型
@interface Dog : RLMObject
@property NSString *name;
@property NSInteger age;
@end

// 實現文件
@implementation Dog
@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]];

使用指定初始化器(designated initializer)創建對象是最簡單的方式。請注意,所有的必需屬性都必須在對象添加到 Realm 前被賦值。
通過使用恰當的鍵值,對象還可以通過字典完成創建。
最后,RLMObject 子類還可以通過數組完成實例化,數組中的值必須和數據模型中對應屬性的次序相同。

嵌套屬性(Nested Object)

如果某個對象中有 RLMObject 或者 RLMArray 類型的屬性,那么通過使用嵌套的數組或者字典便可以對這些屬性遞歸地進行設置。您只需要簡單的用表示其屬性的字典或者數組替換每個對象即可:

// 這里我們就可以使用已存在的狗狗對象來完成初始化
Person *person1 = [[Person alloc] initWithValue:@[@"李四", @30, @[aDog, anotherDog]]];

// 還可以使用多重嵌套
Person *person2 = [[Person alloc] initWithValue:@[@"李四", @30, @[@[@"小黑", @5],
                                                                 @[@"旺財", @6]]]];

即使是數組以及字典的多重嵌套,Realm 也能夠輕松完成對象的創建。注意 RLMArray 只能夠包含 RLMObject 類型,不能包含諸如 NSString
之類的基礎類型。

添加數據

向 Realm 中添加數據的步驟如下:

// 創建對象
Person *author = [[Person alloc] init];
author.name    = @"大衛·福斯特·華萊士";

// 獲取默認的 Realm 實例
RLMRealm *realm = [RLMRealm defaultRealm];
// 每個線程只需要使用一次即可

// 通過事務將數據添加到 Realm 中
[realm beginWriteTransaction];
[realm addObject:author];
[realm commitWriteTransaction];

等您將某個對象添加到 Realm 數據庫之后,您可以繼續使用它,并且您對其做的任何更改都會被保存(必須在一個寫入事務當中完成)。當寫入事務提交之后,使用相同 Realm 數據源的其他線程才能夠對這個對象進行更改。

請注意:如果在進程中存在多個寫入操作的話,那么單個寫入操作將會阻塞其余的寫入操作,并且還會鎖定該操作所在的當前線程。
這個特性與其他持久化解決方案類似,我們建議您使用該方案常規的最佳做法:將寫入操作轉移到一個獨立的線程中執行。

由于 Realm 采用了 MVCC 設計架構,讀取操作 并不會 因為寫入事務正在進行而受到影響。除非您需要立即使用多個線程來同時執行寫入操作,不然您應當采用批量化的寫入事務,而不是采用多次少量的寫入事務。
查看RLMRealmRLMObject來獲得更多內容。

更新數據

Realm 提供了一系列用以更新數據的方式,這些方式都有著各自所適應的情景。請選擇最符合您當前需求的方式來使用:

內容直接更新

您可以在寫入事務中通過設置某個對象的屬性從而完成對象的更新操作。

// 在一個事務中更新對象
[realm beginWriteTransaction];
author.name = @"托馬斯·品欽";
[realm commitWriteTransaction];

通過主鍵更新

如果您的數據模型中設置了主鍵的話,那么您可以使用+[RLMObject createOrUpdateInRealm:withValue:]
來更新對象,或者當對象不存在時插入新的對象。

// 創建一個帶有主鍵的“書籍”對象,作為事先存儲的書籍
Book *cheeseBook = [[Book alloc] init];
cheeseBook.title = @"奶酪食譜";
cheeseBook.price = @9000;
cheeseBook.id = @1;

// 通過 id = 1 更新該書籍
[realm beginWriteTransaction];
[Book createOrUpdateInRealm:realm withValue:cheeseBook];
[realm commitWriteTransaction];

如果主鍵 id 為1的 Book 對象已經存在于數據庫當中了,那么對象就會簡單地進行更新。而如果不在數據庫中存在的話,那么這個操作將會創建一個新的 Book 對象并添加到數據庫當中。
您同時通過傳遞您想要更新值的集合,從而更新帶有主鍵的某個對象的部分值,比如說如下所示:

// 假設帶有主鍵值 `1` 的“書籍”對象已經存在
[realm beginWriteTransaction];
[Book createOrUpdateInRealm:realm withValue:@{@"id": @1, @"price": @9000.0f}];
// 這本書的`title`屬性不會被改變
[realm commitWriteTransaction];

如果對象沒有定義主鍵的話,那么您不能夠調用出現在本章的這些方法(也就是那些以 OrUpdate 結尾的方法)。
請注意:當對象更新的時候,NSNull 仍然會被認為是可選屬性 的有效值。如果您提供了一個屬性值為 NSNull 的字典,那么這些都會應用到您的對象當中,并且對應的屬性都將為空。為了確保不出現任何意外的數據丟失,請在使用此方法的時候再三確認只提供了您想要進行更新的屬性。

鍵值編碼

RLMObjectRLMResult 以及 RLMArray 都遵守鍵值編碼(Key-Value Coding)(KVC)機制。 當您在運行時才能決定哪個屬性需要更新的時候,這個方法是最有用的。
將 KVC 應用在集合當中是大量更新對象的極佳方式,這樣就可以不用經常遍歷集合,為每個項目創建一個訪問器了。

RLMResults<Person *> *persons = [Person allObjects];
[[RLMRealm defaultRealm] transactionWithBlock:^{
  [[persons firstObject] setValue:@YES forKeyPath:@"isFirst"];
  // 將每個人的 planet 屬性設置為“地球”
  [persons setValue:@"地球" forKeyPath:@"planet"];
}];

刪除數據

通過在寫入事務中將要刪除的對象傳遞給 -[RLMRealm deleteObject:]
方法,即可完成刪除操作。

// 存儲在 Realm 中的 cheeseBook 對象

// 在事務中刪除一個對象
[realm beginWriteTransaction];
[realm deleteObject:cheeseBook];
[realm commitWriteTransaction];

您也能夠刪除存儲在 Realm 中的所有數據。注意,Realm 文件的大小不會被改變,因為它會保留空間以供日后快速存儲數據。

// 從 Realm 中刪除所有數據
[realm beginWriteTransaction];
[realm deleteAllObjects];
[realm commitWriteTransaction];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容