gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:27:04 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

您的保存方法每次都会创建一个新的 CPIEntity 对象。因此,除非您删除代码中其他地方的旧对象,否则我怀疑您的提取返回了几个对象,第一个对象在 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 不为零;适当修改以处理这种情况。

关于ios - 如何更新核心数据中的可转换属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31634688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com