将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久
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。在执行所有这些操作之前,您需要创建一个新模型版本(编辑器 -> 添加模型版本)并使其成为活动版本。希望对您有所帮助。
天哪!哈哈,我只是很密集。非常感谢!生病尝试一下,希望它有效,我检查一下答案。再次感谢理查德! :)以上是关于将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久的主要内容,如果未能解决你的问题,请参考以下文章