Как обновить трансформируемый атрибут в основных данных
Я нахожусь в ситуации, когда мне нужно обновить трансформируемый атрибут в моей сущности в основных данных, до сих пор я пробовал все возможные ответы от 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 значениями?
Есть ли конкретная запись, которая не "удаляется"? Это может указывать на проблему с "удалить" (или отсутствие там).
Кроме того, если вы полностью замените контент, какой результат вы получите при получении?