iPhone - основной вопрос данных?
У меня есть 2 лица: пользователь, адрес. Я установил отношения, которые каждый пользователь может иметь много "адрес". Я не уверен, как работают основные данные, но, насколько я понимаю, каждый раз, когда я вызываю insertEntityForName, он создает и сохраняет объект. (также строка в таблице)
Итак, вопрос: не хранит ли следующий код дублирующий адрес в основных данных?
- Когда я вставляю для пользовательского объекта, он также вставляет адрес
- Когда я вызываю вставку для адресной сущности, она создает другой адрес.
Если я прав, и это на самом деле создает дубликат в базе данных, как это предотвратить?
User *user = [NSEntityDescription insertEntityForName:@"User"
inManagedObjectContext:self.managedObjectContext];
user.firstName = @"first name";
user.lastName = @"last name";
Address *address = [NSEntityDescription insertEntityForName:@"Address"
inManagedObjectContext:self.managedObjectContext];
address.street = @"street";
user.address = address;
2 ответа
Нет, это не создаст дубликат адреса. С первой вставкой он только создает User
, не Address
, Адрес пользователя будет ноль.
Если вы действительно сделали Address
Отношения пользователя один ко многим, вы не можете назначить user.address
так, он должен дать предупреждение, так как он ожидает NSSet*
, Также я бы рекомендовал назвать это addresses
, Ты можешь сделать:
user.address = [NSSet setWithObject:address];
или же
[user addAddressObject:address];
CoreData не ограничивается базами данных, он также может работать в памяти или с использованием XML. Вот как все происходит, когда вы используете хранилище sqlite.
Базовые данные вставляют одну строку в пользовательскую таблицу, а другую - в таблицу адресов. Если адрес может иметь только одного пользователя, он добавит столбец (при настройке базы данных) в таблицу адресов, который будет содержать идентификатор записи пользователя. Вот как эти два связаны. Также не имеет значения, как вы создаете ссылку, либо user.address = XY; или XY.user = пользователь;
Однако user.address = XY работает, только если у пользователей может быть только один адрес.