这是一个非常直截了当的问题。
我有一个使用本地文件初始化的CoreData数据库。 CoreData架构如下所示:
Category -->> Objections -->> Responses -->> Evidence
(“ - >>”表示有很多)
我正在使用NSFetchedResultsController从核心数据中检索对象。很标准。
NSEntityDescription *entity = [NSEntityDescription entityForName:NSStringFromClass([OHObjection class])inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"[suitable key]" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"category.objectionCategoryText" cacheName:nil];
每个“To To”关系都是有序的。
问题:是否可以按照创建顺序获取数据而不使用时间戳或明确设置我自己的ID?
注意:我没有反对使用时间戳或创建自己的ID,我只想知道是否可能。
答案 0 :(得分:6)
来自Core Data Programming Guide:
如何按照我创建的顺序获取对象?
持久性存储中的对象是无序的。通常,您应该在控制器或视图层强加订单, 基于创建日期等属性。如果您的数据中存在固有的订单,则需要明确建模 这一点。
所以是的,您必须使用时间戳或明确设置自己的ID。
答案 1 :(得分:4)
创建顺序未记录在数据存储中,因此没有。
如果您有一个有序的关系和,请确保以与创建它们相同的顺序向此关系添加对象,然后将保留该顺序。你不会通过直接获取对象来获得它,你可以通过遍历关系来获得它(即通过查看具有有序关系的对象)。
对于任何其他情况,唯一的排序是您指定的顺序 - 时间戳,唯一ID等。
如果使用时间戳,请确保使用足够的精度来处理循环中创建的多个对象(例如,1秒精度几乎肯定不够好)。如果使用递增的ID,请确保在单个队列上分配值,以避免多线程重复。