如何更新核心数据中的可转换属性

时间:2015-07-26 07:27:33

标签: ios core-data attributes nsmutabledictionary transformable

我处于这样一种情况,我需要在核心数据中更新我的实体中的可转换属性,直到现在我已经尝试了谷歌和堆栈溢出的所有可能答案,但没有实现任何目标。

这是我在核心数据中保存对象的方法,我保存的对象是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 {

}

}

这就是我的核心数据的样子: - enter image description here

感谢任何帮助。

修改

我现在在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;

但我仍然没有得到正确的结果。 现在当我刷新数据并使用EDIT部分中解释的上述过程保存它并获取它时,我得到更新的数据,但它增加了对象的数量,就像我第一次尝试获取数组中的1个对象时,在第二次尝试时,我得到了2个对象,它就像这样,所以当添加新数据时,它不会更新它,而是将它添加到实体的fixed_Model属性中,并增加对象的数量。

最后我现在使用这行代码从didFetchFromCoreDataModel方法中的数组中获取最后一个和更新对象

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

2 个答案:

答案 0 :(得分:2)

您的save方法每次都会创建一个新的CPIEntity对象。因此,除非您删除代码中其他位置的旧对象,否则我怀疑您的fetch正在返回多个对象,第一个对象具有fixed_Model属性中包含19个键/值对的字典,以及第二个/后续对象包含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不是零;适当修改以处理该案件。

答案 1 :(得分:0)

你能缩小问题的范围吗?

IE中。你可以比较两个字典......原始的有19个值,新的有18个值吗?

是否有特定条目未被删除'?这可能意味着“删除”的挑战。 (或缺乏)。

或者,如果您完全替换了内容,您获取的结果是什么?