如何在`RLMArray`中使用`removeAllObjects`

时间:2014-10-23 19:11:15

标签: ios objective-c realm

如何在removeAllObjects中使用RLMArray? 我收到'RLMException', reason: 'Attempting to mutate a readOnly RLMArray'的错误。

#import "ViewController.h"
#import <Realm/Realm.h>
#import "Person.h"

@interface ViewController ()
@property RLMArray *list;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    _list = [Person allObjects];
    NSLog(@"%@", _list);

}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}

- (IBAction)addPerson:(id)sender {
    Person *human = [[Person alloc] init];
    human.name = @"John";
    human.title = @"Wizard";

    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [realm addObject:human];
    [realm commitWriteTransaction];

}

- (IBAction)removePerson:(id)sender {
    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [_list removeAllObjects];
    [realm commitWriteTransaction];
}
@end

3 个答案:

答案 0 :(得分:1)

我不是100%肯定,但我认为这应该有用。

- (IBAction)removePerson:(id)sender {
    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [realm deleteObjects:_list];
    [realm commitWriteTransaction];
}

答案 1 :(得分:1)

您使用的是哪个版本的Realm?从v0.87.0开始,查询返回RLMResults个对象,而不是RLMArray。这包括您在viewDidLoad:方法中使用的allObjects RLMObject方法。我会将list属性的类型更改为RLMResults并执行rj001建议并在deleteObjects:对象上调用RLMRealm方法。

答案 2 :(得分:1)

正如Michael McGuire所说,+allObjects现在返回一个RLMResults,它不响应-removeAllObjects,但更重要的是,removeAllObjects只删除链接到RLMArray中包含的对象,而不是对象本身。

因此,如果要删除对象(当然也会删除指向它们的链接),则应在RLMRealm实例上使用-deleteObjects:。看起来这就是你想要做的事情。