Как обновить трансформируемый атрибут в основных данных

Я нахожусь в ситуации, когда мне нужно обновить трансформируемый атрибут в моей сущности в основных данных, до сих пор я пробовал все возможные ответы от Google и переполнения стека, но ничего не достиг.

Это метод, в котором я сохраняю объект в основных данных, и мой объект, который я сохраняю, является объектом типа NSMutablDictionary.

-(void)didSaveToCoreData :(NSMutableDictionary *)newDict
{

@try {
    AppDelegate *appDelegate  = [[UIApplication sharedApplication]delegate];

    NSManagedObjectContext *context = appDelegate.managedObjectContext ;

    DataModelSupport *entity = [NSEntityDescription insertNewObjectForEntityForName:@"CPIEntity" inManagedObjectContext:context];


    if (newDict != nil) {

        [entity.fixed_Model removeAllObjects];
        entity.fixed_Model = newDict;
    }

    NSError *error ;
    [context save:&error];
    if(error)
    {
        NSLog(@"Error in Saving Data");
    }
    else
    {
        [self didFetchFromCoreDataModel];
        NSLog(@"Successfully saved");
    }

}
@catch (NSException *exception) {
    [self spareMeFromTheCrash:exception];
}
@finally {

}

}

в этом методе я в первый раз сохраняю объект словаря из 19 ключ / значение и правильно выбираю его в методе didFetchFromCoreDataModel, но когда я обновляю данные и получаю словарь из 18 ключ / значение, я сохраняю этот словарь в основных данных используя тот же метод didSaveToCoreData и извлеките его тем же способом из didFetchFromCoreDataModel, но он по-прежнему показывает 19 ключ / значение

DataModelSupport является подклассом NSManagedObject. В DataModelSupport.h:

@property (nonatomic,weak) NSMutableDictionary *fixed_Model;

В DataModelSupport.m:

@dynamic fixed_Model;

Это для класса DataModelSupport.

Теперь здесь, в этом методе, я выбираю те же данные из основной формы объекта

-(void)didFetchFromCoreDataModel
{

@try {
    AppDelegate *appDelegate  = [[UIApplication sharedApplication]delegate];

    NSManagedObjectContext *context = appDelegate.managedObjectContext ;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];

    NSFetchRequest *request = [[NSFetchRequest alloc]init];
    [request setReturnsDistinctResults:YES];
    [request setReturnsObjectsAsFaults:NO];
    [request setResultType:NSDictionaryResultType];
    [request setEntity:entity];
    NSError *error ;

    NSArray *arr = [context executeFetchRequest:request error:&error];

    updatedfinalArr = [arr valueForKey:@"fixed_Model"];



    if(error)
    {
        NSLog(@"Error");
    }
    else
    {

    }

}
@catch (NSException *exception) {
    [self spareMeFromTheCrash:exception];
}
@finally {

}

}

И вот как мои основные данные выглядят так: введите описание изображения здесь

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ

Я реализовал некоторые изменения в своем коде сейчас в методе didSaveToCoreData. Я использую эту строку кода для извлечения сущности по имени.

NSEntityDescription *descriptor = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];

этим я не создаю новую сущность каждый раз, когда вызываю метод didSaveToCoreData.

и вот как я сохраняю объект NSMutlableDictionary

DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];
[entity.fixed_Model removeAllObjects]
entity.fixed_Model = newDict;

но все же я не получаю правильный результат. теперь, когда я обновляю данные и сохраняю их, используя вышеописанную процедуру, описанную в разделе РЕДАКТИРОВАНИЯ, и извлекаю их, я получаю обновленные данные, но при этом увеличивается количество объектов, как при первой попытке, когда я получаю, я получил 1 объект в массиве, и со второй попытки я получил 2 объекта, и это происходит следующим образом, поэтому, когда добавляются новые данные, они не обновляются, а вместо этого добавляют его в атрибут fixed_Model объекта и увеличивают количество объектов.

Наконец, теперь я использую эту строку кода, чтобы получить последний и обновить объект из массива в методе didFetchFromCoreDataModel

NSDictionary *ddd = [[arr valueForKey:@"fixed_Model"]lastObject];
updatedfinalArr = [NSMutableArray arrayWithObject:ddd];

2 ответа

Решение

Ваш метод сохранения каждый раз создает новый объект CPIEntity. Итак, если вы не удалите старый объект в другом месте вашего кода, я подозреваю, что ваша выборка возвращает несколько объектов, первый из которых содержит словарь с 19 парами ключ / значение в fixed_Model атрибут, а второй / последующие объекты содержат 18 пар ключ / значение.

Когда вы сохраняете, вы должны сначала попытаться получить существующий объект, и если вы получите нулевой результат, то создайте новый объект. Затем установите fixed_Model Атрибут нового / существующего объекта в ваш новый словарь.

РЕДАКТИРОВАТЬ

Вы все еще вставляете новый объект каждый раз (DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];). Ниже приведен пример "извлечь или создать":

AppDelegate *appDelegate  = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = appDelegate.managedObjectContext ;
NSEntityDescription *descriptor = [NSEntityDescription entityForName:@"CPIEntity" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
request.entity = descriptor;
NSError *error;
NSArray *results = [context executeFetchRequest:request error:&error];
if (results == nil) {
    // This implies an error has occurred.
    NSLog(@"Error from Core Data: %@", error);
} else {
    if (results.count == 0) {
        // No objects saved, create a new one...
        DataModelSupport *entity = [[DataModelSupport alloc]initWithEntity:descriptor insertIntoManagedObjectContext:context];            
        entity.fixed_Model = newDict;
    } else {
        // At least one object saved.  There should be only one
        // so use the first... 
        DataModelSupport *entity = [results firstObject];
        entity.fixed_Model = newDict;
    }
}

Для простоты я предположил, что newDict не ноль; изменить в случае необходимости, чтобы справиться с этим делом.

Вы можете сузить проблему?

То есть. Можете ли вы сравнить два словаря... исходный с 19 значениями и новый с 18 значениями?

Есть ли конкретная запись, которая не "удаляется"? Это может указывать на проблему с "удалить" (или отсутствие там).

Кроме того, если вы полностью замените контент, какой результат вы получите при получении?

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