CoreData ВСТАВИТЬ или ЗАМЕНИТЬ? - PullRequest
6 голосов
/ 09 марта 2010

В настоящее время я выполняю миграцию приложения iphone, используя SQLite, на CoreData.

Мне нужно сделать INSERT или REPLACE, чтобы добавить только новый контент, есть ли способ сделать это, или мне нужно выбрать всю БД и найти существующие объекты и добавить новые?

Спасибо.

Ответы [ 3 ]

15 голосов
/ 09 марта 2010

Помните, что базовые данные - это иерархия объектов, которая сохраняется в БД, поэтому вам нужно рассматривать ее как граф объектов, а не , а не базу данных.

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

обновление

Вам не нужно извлекать все объекты, ищите магазин, используя NSFetchRequest и NSPredicate, чтобы проверить существование; если существует, обновите, если не создайте.

7 голосов
/ 10 марта 2010

См. Apple, документ , озаглавленный «Эффективный импорт данных».Это именно та тема, которую вы хотели бы изучить.В частности, внимательно прочитайте раздел «Эффективное осуществление поиска или создания».

И, конечно же, купите книгу Маркуса Зарры о базовых данных, которая фантастическая:

3 голосов
/ 01 февраля 2015

В основном мы упорядочиваем вставленные (извлеченные) данные и данные json, чтобы при каждом индексе они имели равные значения. Затем мы получаем значение по соответствующему индексу и обновляем управляемый объект, а в случае, если счетчик больше длины извлеченных результатов, мы вставляем новый управляемый объект.

//Add JSON objects into entity

- (void) insertUpdate:(NSArray *)jsonArrayData {

    //sort JSON Data

    NSSortDescriptor *idDescriptor = [[NSSortDescriptor alloc] initWithKey:@"entityID" ascending:YES selector:@selector(localizedStandardCompare:)];
    NSArray *sortDescriptors = @[idDescriptor];
    NSArray *sortedJSONArray = [jsonArrayData sortedArrayUsingDescriptors:sortDescriptors];


    //get entity
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"entity" inManagedObjectContext:self.managedObjectContext];

    // Get the ids from json in sorted order.
    NSMutableArray *entityIDs = [[NSMutableArray alloc]init];

    for (NSDictionary *jsonValues in jsonArrayData) {

        id value = [jsonValues objectForKey:@"entityID"];

        [entityIDs addObject:value];
    }

    //sort to make sure json and fetched data are both sorted in same manner
    [entityIDs sortUsingSelector:@selector(compare:)];


    // create the fetch request to get all Entities matching the IDs
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];

    NSString *filter = @"(%K IN %@)";

    [fetchRequest setPredicate: [NSPredicate predicateWithFormat: filter, @"entityID", entityIDs]];

    // Make sure the results are sorted as well.
    [fetchRequest setSortDescriptors:
     @[ [[NSSortDescriptor alloc] initWithKey: idName ascending:YES] ]];

    // Execute the fetch.

    NSError *fetchError;
    NSArray *entityMatchingNames = [self.elRehabCoreData.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];


    int i = 0;

    //loop over JSONData
    for (NSDictionary *keyedValues in sortedJSONArray) {


        id value = [keyedValues objectForKey:@"entityID";

        //Create NSManagedObject
        NSManagedObject *managedObject = nil;
        int updateInsert = 0;


        if(entityMatchingNames.count > i ){
            //update
            managedObject = [entityMatchingNames objectAtIndex:i];

            if ([[managedObject valueForKey:@"entityID"] isEqual:[keyedValues valueForKey:@"entityID"]]){

                updateInsert = 1;
            }

        }else{
            //insert
            managedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
            updateInsert = 1;
        }

        i++;

        //set value if updateInsert is true
       // The updateInsert flag is an extra security to make sure we only update when the value in JSON data is equal that of fetched data

        if (updateInsert) {
            [managedObject setValue:value forKey:attribute];
        }


    }
     //save core data stack
     [self saveContext];

}
...