2012-03-11 2 views
9

У меня возникла проблема.Как предотвратить дублирование Core Data в iOS 5?

В выходные дни я работал над проектом, где я вытаскиваю большой xml из веб-сервиса.

В основном это 3 уровня - Клиенты, Менеджеры, Персонал всех иерархических. Таким образом, при первом запуске приложения он извлекает этот xml и анализирует его и создает все записи в 3 выпущенных лицах - клиенте, менеджерах и персонале.

Каждый раз, когда приложение запускается, мне нужно вытащить тот же самый XML-файл, но на этот раз мне нужно только обновить любую из существующих записей, которые были изменены, или добавить новые для новых клиентов, менеджеров или персонала, которые появились с прошлого раза.

Итак - в данный момент, как я уже сказал, он все тянет, правильно разбирает и создает правильные объекты и заполняет все атрибуты.

Однако без изменения данных, на 2-ом запуске он дублируя все данные - так что вместо 15 клиентов (правильное число) У меня есть 30 и так далее ...

ли я действительно должен добавьте много кода в мой синтаксический анализ, чтобы проверить, что вместо создания нового объекта NSManagedObject я проверяю, если он уже существует?

И если это - мне нужно вручную проверить каждый атрибут?

Это ужасно болезненно и долговечно - не существует способа заставить Core Data делать это для меня - автоматически?

Спасибо за любую помощь или предложения.

ответ

3

Как указано в Apple, Документах https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

Вы должны цикла модели данных и обрабатывать его оттуда, как этот

Пример :

// loop over employeeIDs 
// anID = ... each employeeID in turn 
// within body of loop 

NSString *predicateString = [NSString stringWithFormat: @"employeeID == %@", anID]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 

Лично я не являюсь ke этот метод, и я написал этот фрагмент кода, который обрабатывает это в про-эффективной усадьбе, и это прямо! Я заметил, что с помощью метода Япс я столкнулся с проблемами со строками, имеющими разные символы, такие как буквы и пробелы в капитолиях. Ниже код протестирован и работает, если вы правильно переименовали все соответствующие объекты. Я честно считаю, что это самый эффективный способ добиться не добавления дубликатов в основные данные.

-(void)AvoidDuplicatesinDataModel 
{ 
    // Define our table/entity to use 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" 
               inManagedObjectContext:managedObjectContext]; 

    // Setup the fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Define how we will sort the records 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"users" 
                    ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    // Fetch the records and handle an error 
    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
              executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // Handle the error. 
     // This is a serious error 
    } 

    //here usersNameTextField.text can be any (id) string that you are searching for 
    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:usernameTextField.text]) { 
     //Alert user or handle your duplicate methods from here 
     return; 
    } 
} 
+0

Почему изменяемое копирование для результатов выборки? – dmur

12

Я боюсь, что вам нужно сохранить свою БД чистой самостоятельно. Самый простой способ - использовать NSFetchRequest: при импорте обновленных данных вы можете запустить запрос против существующих данных и решить, что вы хотите сделать.

Как Маркус С. Zarra упоминается в another thread об этой теме:

При импорте новой строки вы можете запустить запрос к существующих строк, чтобы увидеть, если он уже на месте. Для этого вы создаете в NSFetchRequest против вашей организации, установить предикат искать на Guid свойства и установить на максимум возвращаемых строк 1.

я рекомендовал бы держать это NSFetchRequest вокруг во время вашего импорта, так что вы можете повторно использовать его во время импорта. Если NSFetchRequest возвращает строку, вы можете обновить эту строку. Если он не возвращает строку, вы можете вставить новую строку.

Когда все будет сделано правильно, вы найдете более чем .

Другой источник для хорошей информации являются яблоки Программирование проводники: Core Data Programming Guide

+0

Да, я понял. – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun Если бы мой пост был полезным, вы можете его принять :) – dom

+1

Ссылка мертва – Besi