gpt4 book ai didi

ios - 更新核心数据记录<故障>

转载 作者:行者123 更新时间:2023-11-28 23:13:40 28 4
gpt4 key购买 nike

我正在尝试更新 Core Data 中的一些记录。我正在采取以下步骤来完成它

  1. 带谓词的获取函数从核心数据中检索记录
  2. 将结果集存储在对象数组中
  3. 遍历数组并更新每条记录
  4. 调用保存上下文

我遇到了两个问题

  • 初始运行后,我在日志中得到<故障>
  • 我不确定保存上下文是否真的会保存对象

我的代码:

- (void)fetchExpenses {     
// Define our table/entity to use
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:managedObjectContext];

// Setup the fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];

// Define how we will sort the records
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:NO];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];
[sortDescriptor release];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"publishTimestamp == nil"];
[request setPredicate:predicate];


// Fetch the records and handle an error
NSError *error;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

if (!mutableFetchResults) {
// Handle the error.
// This is a serious error and should advise the user to restart the application
}

// Save our fetched data to an array
[self setExpenseArray: mutableFetchResults];
[mutableFetchResults release];
[request release];
}

- (void) save: {
[self fetchExpenses];
int i = 1;
int max = [expenseArray count];

for(i=1; i<=max; i++) {
// Get the expense selected.
Expense *expense = [expenseArray objectAtIndex: i];
// Do your updates here
[expense setTimestamp:2]

}
}

最佳答案

您在日志中看到的 fault 并不表示错误,而是表示托管对象未完全加载到内存中,而是 represented by a fault object .这是正常行为。当您尝试访问或更改对象属性时,整个对象将“出错”或读入内存。这是一个令人困惑的老式数据库术语,可追溯到 1960 年代。

您的代码不保存任何对象。在您对托管对象上下文调用 save 之前,不会保留对内存中托管对象的更改。

您也不想使用这样的可变副本:

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

...因为它浪费内存并可能导致重复的托管对象。 Apple 文档中有一些代码可以启动它,但它是错误的。相反,只需使用:

NSArray *fetchResults=[managedObjectContext executeFetchRequest:request error:&error];

…这将返回与获取匹配的托管对象的自动释放数组。

关于ios - 更新核心数据记录<故障>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7328872/

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