2014-10-23 4 views
1

Как использовать removeAllObjects в RLMArray? Я получаю ошибку 'RLMException', reason: 'Attempting to mutate a readOnly RLMArray'.Как использовать `removeAllObjects` в` 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 
+0

Я не знаю, что происходит, но вы используете '[_list removeAllObjects]' , но перед этим вы используете '[realm addPerson];' , может быть, это что-то здесь? –

+0

Я имею в виду, может быть, вы должны использовать '[realm removeAllObjects];', Извините, если мне не помогли, я просто попробовал –

+0

Попробуйте '[realm deleteObjects: _list];' возможно? – rfj001

ответ

1

Я не на 100% положительный, но я думаю, что это должно сработать.

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

В какой версии Realm вы используете? Начиная с v0.87.0, запросы возвращают объект RLMResults, а не RLMArray. Это включает в себя метод allObjectsRLMObject, который вы используете в своем методе viewDidLoad:. Я бы изменил тип вашего свойства list на RLMResults и сделал то, что предлагает rj001, и вызывая метод deleteObjects: на объекте RLMRealm.

1

Как Майкл МакГуайр сказал, +allObjects теперь возвращает RLMResults, который не реагирует на -removeAllObjects, но что более важно, removeAllObjects удаляет только ссылки на объекты, которые содержатся в RLMArray, а не сами объекты.

Так что если вы хотите удалить объекты (которые, конечно же, удаляют любые ссылки на них), вы должны использовать -deleteObjects: на экземпляре RLMRealm. Похоже, это то, что вы хотите сделать в этом случае.

 Смежные вопросы

  • Нет связанных вопросов^_^