2015-08-02 4 views
2

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

Data Model

class Person: Object { 
    dynamic var id = 0 
    dynamic var dog: Dog? 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

class Dog: Object { 
    dynamic var id = 0 
    dynamic var name = "" 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

Код

let realm = Realm() 

// query existing dog 
let existingDog = realm.objectForPrimaryKey(Dog.self, key: 42) 
print(existingDog) // id: 42, name: Rex 

// create new dog and person 
let newDog = Dog(value: ["id": 42, "name": "Pluto"]) 
let person = Person() 


realm.write { 
    // this shouldn't update the existing dog 
    // i.e. the name of the dog with id: 42 in the database should still be "Rex" 
    person.dog = newDog 
    realm.add(person, update: true) 
} 

Я также пытался сделать это с помощью realm.create, но успеха не имел ни. Есть идеи?

ответ

3

Свойство id в вашем Dog class является primaryKey. Первичные ключи имеют целью отмечать запись в базе данных как уникальную. Поэтому, если вы создаете объект с использованием одного и того же первичного ключа, вы переопределите любые существующие данные в базе данных, в которой есть первичный ключ.

Я не понимаю, чего вы точно хотите достичь, но не должно быть причин, по которым ваша таблица собак должна иметь несколько объектов с одним и тем же основным ключом. Это не так, как должны работать реляционные базы данных.

Если вам нужно иметь собаку с именем Плутон и собаку с именем Rex с одинаковым значением id, то, вероятно, следует создать новый атрибут, который не является уникальным (-> не помечен как первичный ключ).

+0

Спасибо за ваш ответ. Возможно, я не был так ясен: я хочу создать связь между Лицом и Собакой с id 42, который уже существует в базе данных. В SQL-разговоре я хотел бы установить 'person.dog_id = 42'. – schickling

+0

Вы создали отношения между собакой и человеком. Это не защитит вас, однако, от переопределения объекта в таблице собак с одинаковым идентификатором. Под областью капота, вероятно, создается таблица для вас с колонками: personId и dogId. Там он определяет отношения 1: 1 для вас. Это не влияет на вашу собаку. Таблица в любом случае – ezcoding

+0

ezcoding правильна, основная цель первичного ключа - сделать каждый объект уникальным, другая проблема заключается в том, что у вас в настоящее время есть соотношение 1: 1. Кажется, что вы хотите, чтобы человек был связан с несколькими собаками, поэтому вы должны использовать отношения «один ко многим» с let dogs = List (). Каков конечный результат, который вы пытаетесь получить? Вы хотите удалить предыдущую собаку, а затем добавить новую, но не удалить Собака из базы данных? – yoshyosh

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