【问题标题】:Using Core Data in app without UITableView在没有 UITableView 的应用程序中使用 Core Data
【发布时间】:2013-10-22 20:47:27
【问题描述】:

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

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

我想使用 Core Data 来存储信息

保存信息很简单,但是更新我的核心数据对象(列表和任务)是我遇到的问题。以及如何使用 Core Data 将特定任务与特定列表相关联。

如果我需要澄清任何事情,请告诉我。

【问题讨论】:

    标签: ios objective-c core-data persistent-storage


    【解决方案1】:

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

    【讨论】:

    • 我更新了我的问题,使其更加清晰。你给我的第一个代码 sn-p 是有道理的。保存我理解的信息。这是我迷路的特定对象的更新(在我的情况下,任务对象已被编辑或标记为已完成)。
    • 查看对响应的修订。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为 Core Data 是最好的选择,因为我有多个需要存储的自定义对象,我添加了我的数据模型的图像,这样你就可以看到我正在构建什么样的结构以及为什么我觉得有必要使用 Core Data。
    【解决方案3】:

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

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

    List <---->> Task
    

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

    【讨论】:

    • 我添加了我的数据模型的图像,以便您可以看到我在做什么。我已经按照您的建议添加了时间戳,谢谢。我的问题与您提到的 NSFetchedResultsController 有关。你能解释一下如何使用它吗?
    • 使用第一段中解释的模板开始一个新项目。通读主视图控制器,了解获取结果控制器如何驱动表视图中的数据。
    • 我确实看过你上面提到的模板,似乎使用的技术是特定于将 Core Data 与 UITableViews 一起使用的。我可以查看的任何资源都可以帮助我了解如何在没有 tableview 的情况下使用 Core Data?
    • 当然,只要使用Xcode中的帮助功能,查找NSFetchedResultsController即可。原则上,使用模板中的惰性实例化和上述fetchedObjects。这真的很简单,一旦你掌握了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多