Использование Realm при попытке удалить один объект вызывает исключение («Можно добавить объект в Realm только в транзакции записи»)

Я пытаюсь удалить 1 объект в области, но не могу выполнить этот метод. Здесь что-то не так?

var realm = RLMRealm.defaultRealm() 
realm.beginWriteTransaction()
var soo = Sample3()
soo.sampleKey = "edit1"
soo.id = 0
realm.deleteObject(soo)
realm.commitWriteTransaction()
println("deleted")

У него такая ошибка...

swiftRealm[50559:847671] *** Terminating app due to uncaught exception 'RLMException', reason: 'Can only add an object to a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first.'


person zapKILIG    schedule 13.11.2014    source источник
comment
Каково желаемое поведение? Также, пожалуйста, не кричите   -  person John Dvorak    schedule 13.11.2014
comment
Realm находится здесь: realm.io Если у вас возникли проблемы с этим, спросите их.   -  person matt    schedule 13.11.2014
comment
@matt На самом деле в StackOverflow есть тег realm.io (я обновил вопрос, чтобы использовать этот тег вместо «область», который предназначен для другой цели).   -  person Jasper Blues    schedule 13.11.2014


Ответы (3)


Я немного запутался, вы пытаетесь добавить объект или удалить объект? Я видел, что вы создали объект Sample3, который, как я полагаю, является RLMObject, но ИМХО вы создаете новый RLMObject только тогда, когда хотите добавить объект в Realm.

Если вы хотите удалить объект из Realm, вы должны сначала получить объект из Realm, а затем удалить его. Что-то вроде:

Sample3 *obj = [Sample3 objectsWithPredicate:[NSPredicate predicateWithFormat:@"sampleKey = %@ AND id = %d", @"edit1", 0]][0]
[realm deleteObject(obj)]

Извините, я не знаком с синтаксисом Swift, поэтому выше в Obj-c. Надеюсь, поможет.

person Evan Chu    schedule 13.11.2014

Эван Чу прав, вы создаете новый объект, а затем просите удалить его еще до того, как он будет добавлен в Царство.

Сначала вам нужно запросить объект, который вы хотите удалить (при условии, что он уже сохранен в области), то есть:

var objectToDelete = Sample3.objectsWhere("id == 0")

Затем вы можете удалить этот объект

realm.beginWriteTransaction
realm.deleteObject(objectToDelete)
realm.commitWriteTransaction
person yoshyosh    schedule 13.11.2014

Мой код:

var hello   =   Sample3.objectsWhere("id = 0") // maybe: Sample3.objectsWhere("id = '0'") or        Sample3.objectsWhere("sampleKey = 'edit1'")
let realm = RLMRealm.defaultRealm()
realm.beginWriteTransaction()
realm.deleteObject(hello.firstObject() as RLMObject)
realm.commitWriteTransaction()

Когда вы устанавливаете: var hello = Sample3.objectsWhere("id == 0"). привет это RLMResults. Это не RLMObject, поэтому вы не можете удалить этот объект. Вы должны удалить RLMObject как hello.firstObject() Дополнительная информация: http://realm.io/docs/cocoa/0.87.1/api/Classes/RLMResults.html#//api/name/realm

person huynhba.hieu    schedule 29.11.2014