Tableview 中的 Xcode 核心数据

Posted

技术标签:

【中文标题】Tableview 中的 Xcode 核心数据【英文标题】:Xcode Core Data in Tableview 【发布时间】:2014-10-19 19:16:22 【问题描述】:

我的应用在应用商店中,在更新到 ios 8 并在我的新 iphone 6 上测试该应用后,该应用无法正常运行。 我已经发现了问题:我在 nsuserdefaults 中存储了 3 维数组,它给了我错误:将对象发送到不可变...。 所以我可以忘记将 3d 数组存储在 nsuserdefaults 中,因为我无法真正更改它们。

我的想法是将所有数据存储在核心数据中。伟大的! 但我要学习! 所以.... 我有 5 个属性,如您在图像上看到的:

当按下添加按钮时,所有 5 个属性都由 sqlite 文件中的核心数据保存。 日期类型的属性“基准”来自日期选择器,因此我可以选择一个日期。其他属性是小时、分钟和一些音符 - 字符串。 所以,我想这样看我的表格视图:

2014                <--- sectiontitle with year
   -October         <--- rows cell.text
   -November        <--- rows cell.text

2015                <--- sectiontitle with year
   -January         <--- rows cell.text
   -May             <--- rows cell.text

在这个例子中,我在 2014 年 10 月 + 11 月和 2015 年 1 月 + 5 月输入了条目。 这意味着,这个表格视图是对所有数据的概述,我想在年份和月份中进行过滤。 这样做的最佳方法是什么。 有没有比以下更简单的方法:获取日期、将日期放入数组、设置 dateformatter 并找到不相等的日期来获取年份和月份? 因为,当推送一个单元格时,例如第 0 节中的 october,会打开一个详细视图,我想显示我在 2014 年 10 月所做的所有条目。

你有什么建议?请帮忙!!!

【问题讨论】:

您应该认真阅读与 Core Data 相关的所有内容。提示:NSPredicate 是你的朋友。还有NSFetchedResultsController. 谢谢,在使用谓词过滤后,我将从我的日期对象中获取年份和/或月份。但是如何将属性 vorlagen 与日期相关联。字符串如何知道它的关联。 【参考方案1】:

如果用户默认值足以满足您的需求,我会坚持使用它,但在您阅读时将数据转换为可变的东西。您可以使用CFPropertyListCreateDeepCopy 将不可变属性列表转换为可变属性列表。顾名思义,它是一个深拷贝,您可以让它将可变容器和/或叶子转换为可变等价物。

如果您从用户默认值读取到NSDictionary *userDefaultsData,请转换为

NSDictionary *mutableData = CFPropertyListCreateDeepCopy(NULL, userDefaultsData, kCFPropertyListMutableContainers);

这将递归地复制整个内容,将NSDictionary 转换为NSMutableDictionary 并将NSArray 转换为NSMutableArray

【讨论】:

谢谢汤姆!我会在接下来的几天里试试这个!如果我理解正确,当我使用 deepcopy 时,我可以以“正常”方式使用数组或字典,而无需使用 [array mutablecopy]; ? 在 appdelegate 中:这是我的数组之一---> stdPickerArray = [[NSMutableArray alloc] initWithArray:[def objectForKey:@"gesamtStdArray"]]; 这是我的字典,例如----> _dict = [NSDictionary dictionaryWithObjectsAndKeys:stdPickerArray, @"stdDict",nil]; [def registerDefaults:_dict]; [定义同步];那我应该把我的字典换成你说的那个吗?【参考方案2】:

再次感谢汤姆,你让我免于繁重的工作!!!

在 appdelegate 中我改变了...

stdPickerArray= [[NSMutableArray alloc] initWithArray:[def objectForKey:@"gesamtStdArray"]];

到...

stdPickerArray= [[NSMutableArray alloc] initWithArray:[def objectForKey:@"gesamtStdArray"]];
stdPickerArray = CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (CFPropertyListRef)stdPickerArray, kCFPropertyListMutableContainers));

太棒了!!!

【讨论】:

以上是关于Tableview 中的 Xcode 核心数据的主要内容,如果未能解决你的问题,请参考以下文章

快速获取具有一对多关系的核心数据

RestKit - 无法在我的 tableView 上显示 JSON 数据

如何使用tableview删除核心数据中的数据

不同 tableView 部分中的核心数据对象

核心数据 - 可以使用 NSSortDescriptor 中的块对 TableView 进行排序吗?

Xcode Swift 在 tableView 中显示来自 CloudKit 的数据