我有一个简单的待办事项列表应用程序。它使用以编程方式为任务间隔的动态生成的文本字段(我没有使用 UITableView 因为一些自定义动画和我想使用的东西)。
在应用程序中,用户可以创建多个列表(家庭、工作、学校等),每个列表都有自己的任务。
我想使用 Core Data 来存储信息
保存信息很简单,但更新我的核心数据对象(列表和任务)是我卡住的地方。此外,如何使用 Core Data 将特定任务与特定列表相关联。
让我知道是否需要澄清任何事情。
我有一个简单的待办事项列表应用程序。它使用以编程方式为任务间隔的动态生成的文本字段(我没有使用 UITableView 因为一些自定义动画和我想使用的东西)。
在应用程序中,用户可以创建多个列表(家庭、工作、学校等),每个列表都有自己的任务。
我想使用 Core Data 来存储信息
保存信息很简单,但更新我的核心数据对象(列表和任务)是我卡住的地方。此外,如何使用 Core Data 将特定任务与特定列表相关联。
让我知道是否需要澄清任何事情。
我对您的问题并不完全清楚,但是,更新托管对象的任务很简单。当您进行初始添加(类似于 SQL 中的“插入”)时,您可能会使用如下代码:
NSManagedObject *obj;
obj = [NSEntityDescription insertNewObjectForEntityForName:@"UserData" inManagedObjectContext:context];
[obj setValue:user forKey:@"userName"];
[obj setValue:goalCategory forKey:@"goalCategory"];
[obj setValue:goalDetail forKey:@"goalDetail"];
NSError __autoreleasing error;
[context save:&error];
这就是插入新项目的内容。要在找到正在处理的托管对象后进行更新,只需更改托管对象中的值并使用 [context save:&error]。这是一个例子:
UserData *uData = (UserData *) managedObj;
uData.itemName = nameText;
NSError __autoreleasing *error;
[context save:&error];
差不多就是这样。
至于更新,一旦您选择了要更新的对象,它们就会包含在
fetchedResultsController.fetchedObjects
这是一个NSArray。所以,你可能会做这样的事情:
UserData *uData = (UserData *) [fetchedResultsController.fetchedObjects objectAtIndex:3];
uData.completed = YES;
NSError __autoreleasing *error;
[context save:&error];
因此,对于 fetchedObjects 数组中索引 3 处的对象,这会将 UserData 实体中完成的字段更新为 == YES。
我知道还有其他更新方法和许多选项,但我没有发现对它们有任何需求。fetchedObjects 是一个数组,其中包含您的 fetch 返回的项目;要更新它们,将每个对象强制转换为实体(定义为 NSManagedObject),进行更改然后保存上下文。
HTH。
你最好的选择是NSFetchedResultsController
。您可以完全按照 Xcode 模板建议的模式使用它(您可以通过创建一个新项目 Master-Detail 并检查“用户核心数据”来查看它)。
您可以为您的对象模型(实体Task
)设置名称的字符串属性以及NSNumber
完成的布尔属性等。我还建议使用时间戳和序列号来订购它(我发现NSOrderedSet
不可靠)。您的实体List
应该与Task
. 很直接。
List <---->> Task
现在唯一的区别是找到正确的对象,因为你不能使用objectAtIndexPath
. 您可以为此使用索引fetchedResultsController.fetchedObjects
。只需确保您的对象按预期排序。
首先,认为在您的项目中使用 Core Data 是个好主意。如果您的模型轻巧简单,那么使用 plist 可能会更好。如果您选择 Core Data,请记住 2 条规则:
NSManagedObjectContext
;现在不用担心优化。实现任何更新存储的方案。确保它有效。然后你应该尝试一些其他的更新方法。