【问题标题】:iOS - Reorder Items in CoreDataiOS - 在 CoreData 中重新排序项目
【发布时间】:2015-12-23 02:28:46
【问题描述】:

我有一个 tableView 和一个数组 locationsArray。位置数组从我的 CoreData 中的数据填充到 viewDidLoad

我已经在 tableView 上实现了重新排序方法,并且效果很好,但是我不知道如何将重新排序的数组保存回 CoreData。我尝试删除 CoreData 中的所有内容,只保存新的 reorderedArray。尽管这显然是非常昂贵的资源,但似乎只是以看似随机的顺序将元素加载回数组中。

是否有一种简单的方法可以做到这一点,我错过了,或者您不能按特定顺序将内容存储在 CoreData 中吗?

【问题讨论】:

  • 随机顺序比较快,所以如果需要保留顺序,可以使用有序关系或者添加一个用于排序(比较)的属性。
  • 所以我可以制作自己的订购套装吗?你知道这将如何运作吗?
  • 如果一个关系适合您的数据模型,启用“Ordered”复选框,Xcode 将为您生成一个有序的集合方法(有几个旧的已知问题,我相信您将能够使用搜索快速解决)。否则,可以使用其他属性进行比较,与NSSortDescriptorNSFetchRequest 的 sortDescriptors 数组一起使用,它不需要重大的模型更改,但您必须手动维护新属性(如果 min/max值,在插入或删除元素时进行批量更新等)。

标签: ios objective-c arrays uitableview core-data


【解决方案1】:

严格地说,不可能按一定的顺序存储对象。您只能设置检索对象的顺序

当您从 CoreData 检索 locationsArray 时,您对其订单没有任何保证。 唯一的方法 - 将字段添加到将用于对您的位置进行排序的托管对象。

然后,在检索时,您将能够使用locationsArray = [locationsArray sortedArrayUsing<#WhateverYouNeed#>];

您也可以通过使用 NSFetchRequest 的 sortDescriptors 属性来实现此目的。它将为您提供所需的行为。唯一的缺点是,在这种情况下,您的 NSSortDescriptor 不能由块定义,因此如果您使用一些复杂的方法进行排序,则需要使用已获取的数据对结果进行排序

【讨论】:

  • 我明白了,所以出于我的目的,我不想对它们本身进行排序但让用户选择核心数据不可能的顺序?
  • 您希望在从核心数据中检索它们时对其进行排序。因此,您需要存储信息才能应用排序。然后,当用户在表格视图中更改顺序时 - 您更改此“排序信息”。下一次(下一次启动)你从核心数据中获取数据——你按照用户定义的顺序获取它
  • 好的,我明白你在说什么,知道如何存储/创建这个“排序信息”吗?
  • 例如,简单的计算就足够了 - 0,1,2,... 另一种选择,使用有序关系:developer.apple.com/library/prerelease/ios/documentation/Cocoa/…
【解决方案2】:

使用predicate 对数组进行排序,或者在从 coredata 获取数组后使用对其进行排序

 NSArray *sortedlocationarray = [filteredlocationarray sortedArrayUsingDescriptors:@[sortDescriptor]];

filteredlocationarray 来自 coredata。

【讨论】:

  • 我认为您误解了这个问题。我不想对数组进行排序。
  • 将每个位置数组项视为模型,使用 enumerateObjectsUsingBlock 具有属性顺序,您可以为每个项设置顺序并保存上下文
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多