iPhone - основной вопрос данных?

У меня есть 2 лица: пользователь, адрес. Я установил отношения, которые каждый пользователь может иметь много "адрес". Я не уверен, как работают основные данные, но, насколько я понимаю, каждый раз, когда я вызываю insertEntityForName, он создает и сохраняет объект. (также строка в таблице)

Итак, вопрос: не хранит ли следующий код дублирующий адрес в основных данных?

  1. Когда я вставляю для пользовательского объекта, он также вставляет адрес
  2. Когда я вызываю вставку для адресной сущности, она создает другой адрес.

Если я прав, и это на самом деле создает дубликат в базе данных, как это предотвратить?

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 работает, только если у пользователей может быть только один адрес.

Другие вопросы по тегам