[英]How to update transformable attribute in core data
我处于一种需要在核心数据中更新实体中的transformable属性的情况下,直到现在我已经尝试过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方法在代码中实现了一些更改,我正在使用此行代码按名称获取Entity
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];
您的save方法每次都会创建一个新的CPIEntity对象。 因此,除非您在代码中的其他位置删除了旧对象,否则我怀疑您的访fixed_Model
将返回几个对象,其中第一个对象在fixed_Model
属性中具有包含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不为nil; 进行适当修改以处理这种情况。
您可以缩小问题范围吗?
IE浏览器。 您可以比较两个Dictionary ..原始的19个值和新的18个值吗?
是否有没有被“删除”的特定条目? 这可能意味着“删除”(或缺少)的挑战。
或者,如果您完全替换了内容,则获取时会得到什么结果?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.