0

我有一个简单的待办事项列表应用程序。它使用以编程方式为任务间隔的动态生成的文本字段(我没有使用 UITableView 因为一些自定义动画和我想使用的东西)。

在应用程序中,用户可以创建多个列表(家庭、工作、学校等),每个列表都有自己的任务。

我想使用 Core Data 来存储信息

保存信息很简单,但更新我的核心数据对象(列表和任务)是我卡住的地方。此外,如何使用 Core Data 将特定任务与特定列表相关联。

我的数据模型

让我知道是否需要澄清任何事情。

4

3 回答 3

0

我对您的问题并不完全清楚,但是,更新托管对象的任务很简单。当您进行初始添加(类似于 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。

于 2013-10-15T06:45:04.707 回答
0

你最好的选择是NSFetchedResultsController。您可以完全按照 Xcode 模板建议的模式使用它(您可以通过创建一个新项目 Master-Detail 并检查“用户核心数据”来查看它)。

您可以为您的对象模型(实体Task)设置名称的字符串属性以及NSNumber完成的布尔属性等。我还建议使用时间戳和序列号来订购它(我发现NSOrderedSet不可靠)。您的实体List应该与Task. 很直接。

List <---->> Task

现在唯一的区别是找到正确的对象,因为你不能使用objectAtIndexPath. 您可以为此使用索引fetchedResultsController.fetchedObjects。只需确保您的对象按预期排序。

于 2013-10-15T06:46:03.760 回答
-1

首先,认为在您的项目中使用 Core Data 是个好主意。如果您的模型轻巧简单,那么使用 plist 可能会更好。如果您选择 Core Data,请记住 2 条规则:

  1. 每个线程拥有单独的NSManagedObjectContext;
  2. 仅在其线程中使用上下文执行操作。

现在不用担心优化。实现任何更新存储的方案。确保它有效。然后你应该尝试一些其他的更新方法。

于 2013-10-15T06:56:07.553 回答