gpt4 book ai didi

ios - 对核心数据对象的更改未持久

转载 作者:行者123 更新时间:2023-11-29 03:12:31 25 4
gpt4 key购买 nike

我必须在核心数据 NSManagedObjects 中调用 Person 和 Goal。他们有一个多对多的关系。我有一个 TableView Controller ,它显示与给定 Person 对象关联的 Goal 对象。此 tableview Controller 的目的是允许您点击给定目标单元格内的“加号”按钮,并将“点数”从 Person 对象转移到 Goal 对象。

用于执行此操作的获取请求是:

NSManagedObjectContext *context = self.context;

if (self.selectedItemID) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Goal"];
request.sortDescriptors = [NSArray arrayWithObjects:
[NSSortDescriptor sortDescriptorWithKey:@"name"
ascending:YES],
nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(self IN %@) AND (completed == %@)",
person.goals,
[NSNumber numberWithBool:NO]];

if (predicate) [request setPredicate:predicate];

//Note: |self.frc| is defined in the super class
self.frc = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:context
sectionNameKeyPath:nil
cacheName:nil];
self.frc.delegate = self;

这是每个目标单元格中​​的“加号”按钮调用的方法:

- (IBAction)modifyPointsForGoal:(UIButton *)sender {

//Get a reference to the |Goal| object for the button's cell. The view hierarchy may not be fixed,
//so traverse up the view hierarchy until a UITableViewCell is found and get its NSIndexPath

UIView *view = sender;
while (![view isKindOfClass:[GoalForPersonCell class]]) view = view.superview;
GoalForPersonCell *cell = (GoalForPersonCell *)view;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

//Get reference to |Goal| and |Person| object
Goal *cellsGoal = (Goal *)[self.frc objectAtIndexPath:indexPath];
NSManagedObjectID *cellsGoalObjectID = cellsGoal.objectID;
Goal *goal = (Goal *)[self.context existingObjectWithID:cellsGoalObjectID
error:nil];

Person *person = self.person;


//Using the button tag numbers, increment/decrement values as needed
gFPVCSenderButtonType buttonType = (int)sender.tag;
switch (buttonType) {
case giveAdd:
[goal incrementValueBalanceWithDefaults];
break;

case giveSubtract:
[goal decrementValueBalanceWithDefaults];
break;

case bankAdd:
// decrementBalanceForGoalType returns FALSE if there are insufficient funds
if ([person decrementBalanceUsingGoal:goal])
[goal incrementValueBalanceWithDefaults];
break;

case bankSubtract:
// decrementValueBalance returns FALSE if there are insufficient funds
if ([goal decrementValueBalanceWithDefaults])
[person incrementBalanceUsingGoal:goal];
break;

default:
break;
}

每个单元格中的按钮都按预期工作 - 值取自 Person 对象并提供给单元格表示的 Goal 对象。我遇到的问题是对 Person 对象的更改被写入持久存储,但对 Goal 对象的更改却没有。因此,当应用程序重新启动时,目标对象似乎没有变化。

我使用了 SQL 浏览器来验证更改没有被写入磁盘。如果您在关闭应用程序之前在其他 VC 中查看 Goal 对象,那么对 Goal 对象的更改是可见的——就好像对 Goal 对象的更改已写入上下文,但它们不会持续存在,并且仅针对特定的对象。

我尝试使用 XCode 重新生成 NSManagedObject 子类,但没有解决问题。我完全被难住了,在试图弄明白七个小时之后,我已经束手无策了。

最佳答案

将更改保存到持久存储中:

NSError *err= nil;
[managedObjectContext save:&err];

创建后管理您的 FRC(使用一次):

    [FRC setAutomaticallyPreparesContent:<#(BOOL)#>];
[RFC setAutomaticallyRearrangesObjects:<#(BOOL)#>];

关于ios - 对核心数据对象的更改未持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22083140/

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