Подтвердить что ты не робот

Как выполнить вставку/обновление с помощью основных данных

У меня есть основы вставки записей и удаления записей с помощью Core Data; однако, я был бы признателен за помощь с одной из наиболее распространенных функций - вставить/обновить.

В принципе, я использую NSMutableArray arrayWithContentsOfURL, чтобы получить массив, содержащий строки из таблицы mysql. Мне нужно выполнить синхронизацию моего хранилища CoreData.

Другими словами, мне нужно добавить каждую строку в массив в таблицу CoreData, но если она уже существует, мне нужно обновить запись с помощью последних значений. Также, если он существует в Core Data, а не в загруженном массиве, мне нужно его удалить.

Я, вероятно, мог бы взломать это вместе; однако, я хотел бы видеть, как его правильно и эффективно выполнять без утечек памяти.

4b9b3361

Ответ 1

Есть два способа вставки данных в Core Data - и в зависимости от того, что вы используете, зависит от вас. Однако один из них зависит от того, были ли вы созданы классы моделей для вашей модели данных для базы данных Core Data.

Обычный способ заключается в использовании следующего:

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setValue:@"value1" forKey:@"stringColumn"];
[object setValue:12 forKey:@"numberValue"];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

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

Другой метод не сильно отличается, но гораздо безопаснее с точки зрения безопасности типов. Если вы создали классы моделей (которые вы можете сделать из xcdatamodels), то вы можете просто создать объект этого класса и установить его свойства.

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context];
[object setStringColumn:@"value1"];
[object setNumberValue:12];
NSError *error;
if (![context save:&error]) {
    NSLog(@"Failed to save - error: %@", [error localizedDescription]);
}

Чтобы удалить из таблицы, просто извлеките объект из таблицы (я предполагаю, что вы используете второй метод здесь для вставок и как таковой сгенерировали классы моделей) и используйте следующее:

[context deleteObject:object];

Обратите внимание, что вам нужно будет вызвать save, чтобы он вступил в силу.

Надеюсь, это поможет! Удачи!

EDIT: Извините, я, должно быть, неправильно понял вопрос!

Чтобы проверить существующую запись, вам нужно создать запрос на выборку, а затем выполнить ее в контексте управляемого объекта. Как минимум, для запроса на выборку требуется сущность (поэтому она знает, в какую таблицу искать). Чтобы указать условия поиска, вам нужно будет создать предикат (иначе запрос просто вернет все в таблице). Вы также можете указать набор дескрипторов сортировки, чтобы ваши результаты были отсортированы.

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context];
[request setEntity:entity];

NSError *errorFetch = nil;
NSArray *array = [context executeFetchRequest:request error:&errorFetch];

Этот код создает запрос на выборку и возвращает каждый объект из таблицы с именем "таблица" в массиве. Отсюда, поскольку все необходимые объекты находятся в массиве, вы можете проверять и редактировать записи. Если вы внесете какие-либо изменения, не забудьте сохранить контекст! Следующий цикл регистрирует первое значение в каждом объекте, используя ту же таблицу, что и приведенные выше примеры.

for(TableObject *object in array)
{
    NSLog(@"object value1 = %@", object.value1);
}

Вы также можете удалить записи с этой точки, используя вышеупомянутую функцию.

Для получения дополнительной информации о запросах на выборку, пожалуйста, дайте ссылку на класс. Я также очень рекомендую читать описания дескрипторов и предикатов, поскольку они очень важны для поиска ваших базовых данных db, а некоторые их применения менее эффективны, чем другие (особенно в создании NSPredicates).

Удачи!