2016-10-05 3 views
0

У меня есть несколько объектов, которые не определяют первичный ключ (потому что наш сервер обрабатывает первичные ключи и в автономном режиме вы не можете предоставить первичный ключ), поэтому я не могу использовать метод update если я изменить данные, поэтому я попытался следующие:Область: Удалить и Добавить объект: объект удален или недействителен

func updateTest() { 
    let myObjects = realm.objects(MyObject.self).filter("id = 1"); // id is NOT the primary key from realm! 

    var myObject: MyObject!; 

    if (myObjects.count > 0) { 
     myObject = myObjects[0]; 
    } 

    if (myObject != nil) { 
     try! self.realm.write() { 
      self.realm.delete(self.myObject); 
     } 

     // modify 
     self.myObject.status = "waiting"; 

     try! self.realm.write() { 
      self.realm.add(self.myObject); // crash 
     } 
    } 
} 

Но когда я хочу, чтобы добавить объект теперь я получаю:

Terminating app due to uncaught exception: 'RLMException', reason: 'Object has been deleted or invalidated.' 

так несколько вопросов здесь:

Есть ли возможность выбрать только один результат?

Есть ли возможность обновить объект, указав имя поля, которое не является первичным ключом?

Как я могу удалить и прочитать объект без получения этой ошибки?

Возможно, имело смысл реализовать фиктивный первичный ключ?

ответ

1

Что вы пытаетесь сделать, может быть выполнено следующим образом:

func updateTest() { 
    guard let myObject = realm.objects(MyObject.self).filter("id = 1").first else { 
     return 
    } 

    try! realm.write { 
     myObject.status = "waiting" 
    } 
} 

Есть ли возможность выбрать только один результат?

Вы можете использовать Свифт guard let связать первый элемент в наборе результатов на переменный, если она существует, используя предложение else для вашего запасного варианта, если объект не может быть найден. В этом случае я просто возвращаюсь из функции.

Есть ли возможность обновить объект, указав имя поля, которое не является первичным ключом?

Да. Выполните запрос, чтобы найти объект, о котором идет речь, затем измените его свойства, как хотите.

Как удалить и прочитать объект без получения этой ошибки?

Вы не можете удалить и повторно добавить объект. Невозможно восстановить удаленный объект. Нет необходимости делать это, чтобы получить поведение, которое вам нужно.

Возможно, имеет смысл реализовать фиктивный первичный ключ?

Нет необходимости получать поведение, за которым вы после.

+0

спасибо. – Mulgard