将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久

Posted

技术标签:

【中文标题】将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久【英文标题】:Loading core data into array, then populating table view, reordering array's objects doesnt persist 【发布时间】:2013-03-06 02:56:56 【问题描述】:

首先让我告诉你我想做什么。将数据加载到数组中(从核心数据实体),填充表格视图, 如果用户想要,重新排序单元格并更新数组。

就是这样。

我发现了我的问题,我只是不知道如何解决它:

我正在将我的实体数据/属性加载到一个数组中并用数据填充我的表格视图 (以下是问题所在):

-(void)viewWillAppear:(BOOL)animated
if (self.context == nil)

    self.context = [(RootAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"HandgunAmmo" inManagedObjectContext:self.context];
[request setEntity:entity];
NSError *error;
//PROBLEM!!! the 2 lines below this. 
NSMutableArray *array = [[self.context executeFetchRequest:request error:&error] mutableCopy];
[self setTableArray:array];
[self.ammoTable reloadData];
[super viewWillAppear:YES];

所以此时表格视图已加载数据(考虑到 cellForRow 被调用)

用户移动了几个单元格,我更新数组如下:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath     *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath

    // fetch the object at the row being moved
NSString *r = [self.tableArray objectAtIndex:fromIndexPath.row];

    // remove the original from the data structure
[self.tableArray removeObjectAtIndex:fromIndexPath.row];

    // insert the object at the target row
[self.tableArray insertObject:r atIndex:toIndexPath.row];

[self.ammoTable reloadData];


如您所见,重新排序数组的代码应该可以工作。

但是,在viewWillAppear 方法中,我再次将实体属性加载到数组中并使用它来填充表格视图,这就是问题所在。当我更新数组时,它不会更新实体内对象的顺序。有谁知道如何更新它?我真的很感激!

谢谢!

【问题讨论】:

【参考方案1】:

数组中表示的 managedObjects 不知道它们在数组中的位置。因此,重新排列它们的位置会改变它们的可见位置,而不是它们在数据库中的位置。

如果你想排序那么你需要做一些事情:

    让您的 NSFetchRequest 包含一个按排序字段排序的 NSPredicate 让您的 moveRowAtIndexPath 方法不仅重新定位数据,还更新排序字段以反映它们的新位置 将更新的记录保存到数据库中,以便下一次提取具有正确的排序。

如果你已经有一个 fetchResultsController 你可以放弃这个数组,直接使用:

NSManagedObject *ammo = [fetchedResultsController objectAtIndexPath:fromIndexPath];

获取对当前对象的引用。

【讨论】:

感谢您的帮助!如果你不介意的话,我只有一个问题。我的sort field 到底是什么意思?非常感谢! 在模型中添加一个名为“order”的字段并将其设为整数。您可以在创建每一行时为其分配一个值。当您对行重新排序时,在保存之前交换它们的顺序值。 我很抱歉。我不是想让你为我做这项工作或类似的事情,我只是很难理解你。 adding a field 好像你的意思是 textField?但是你说make it an integer 显然不可能有一个文本字段是一个int,那么field 到底是什么意思?非常感谢,再次抱歉让您这么痛苦! 没问题。单击您的 AppName.xcdatamodeld 文件并转到您尝试重新排序的实体。为该实体添加一个名为“order”的属性,类型为整数 32。在执行所有这些操作之前,您需要创建一个新模型版本(编辑器 -> 添加模型版本)并使其成为活动版本。希望对您有所帮助。 天哪!哈哈,我只是很密集。非常感谢!生病尝试一下,希望它有效,我检查一下答案。再次感谢理查德! :)

以上是关于将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久的主要内容,如果未能解决你的问题,请参考以下文章

删除或插入核心数据后表视图未加载

Python求解数组重新组合求最小值(优酷)

我如何解析 JSON,将其排序为数组。提取数据并填充到表格视图中?

重新加载表视图数据,现有数据可见

使用核心数据中的数组填充表视图

如何将自定义数组保存/重新加载到 plist