2013-09-18 6 views
0

У меня есть база данных в моем приложении. Я использую основные данные. Мне нужно обновить локальную базу данных информацией, поступающей с сервера. Я хочу сократить время обновления БД. Предположим, у меня есть таблица с тремя полями «ID», «Имя», «Файл». В атрибуте «файл» сохраняются некоторые большие двоичные данные. Вот код для обновления моей БД.Как сохранить контекст в Core Data

NSEntityDescription *entity=[NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context]; 
NSFetchRequest *fetch=[[NSFetchRequest alloc] init]; 
[fetch setEntity:entity]; 
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"ID == %@", newObject.objectID]; 
[fetch setPredicate:predicate]; 
NSError *fetchError; 
NSArray *fetchedEntities = [managedObjectContext executeFetchRequest:fetch error:&fetchError]; 
NSManagedObject *objectToUpdate = [fetchedEntities firstObject]; 
objectToupdate.name = newObject.name; 
BOOL isRecordUpdated = objectToupdate.isUpdated; // returns YES. 
NSError *saveError; 
[managedObjectContext save:&saveError]; 

Я нашел запись с идентификатором и изменил ее название, а затем сохранил контекст. Объект изменен, и я уверен, что он обновлен на сервере. Вопрос в том, как работает обновление. Будет ли он переписывать всю запись? Я имею в виду, что происходит с атрибутом «файл», также ли он переписан? Если да, то как избежать перезаписи больших полей, которые не изменены.

Ещё один случай. Что делать, если я переписываю имя с новой равной строкой?

NSString *name = [NSString stringWithFormat:@"%@", objectToUpdate.name]; 
BOOL nameChanged = firstName != contact.firstName; // returns YES 
BOOL nameIsEqual = [firstName isEqualToString:contact.firstName]; //returns YES 
objectToUpdate.name = name; 
BOOL hasChanges = [NSManagedObjectContext.defaultContext hasChanges]; //returns YES 

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

ответ

1

Я бы рекомендовал разделить свойства, которые не обновляются часто, особенно если они большие, в отдельный объект, который имеет отношения 1: 1 с родительским объектом. Это имеет два преимущества: 1. При получении родительского объекта дочерний объект остается «ошибкой», если вы его не получаете, и 2. он не требует записи базы данных, если вы только изменяете свойство родительского объекта.

+0

Спасибо за ответ ypur. Я думаю, что это решает половину проблемы. Но что делать со второй частью. Я использую Magical Record для импорта данных из JSON в локальную БД и перезаписывает все записи вместо обновления записей, которые были изменены. – PSsam

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