iPhone Core Data 一次保存多个项目的随机行为?
Posted
技术标签:
【中文标题】iPhone Core Data 一次保存多个项目的随机行为?【英文标题】:iPhone Core Data saving multiple items at once random behavior? 【发布时间】:2009-12-10 22:38:25 【问题描述】:我有一个应用程序可以读取 rss 提要、解析 xml 并使用 Core Data 将其添加到我的数据库中(这样即使没有可用的互联网连接,用户也可以看到提要)这一切都很好。我进行解析的方式是:在 didStartElement 上创建一个新实体,例如:
NewsDB *newsDB = [NSEntityDescription insertNewObjectForEntityForName:@"NewsDB" inManagedObjectContext:managedObjectContext];
self.currentObject = newsDB;
在 didendDocument 中,我只保存所有内容,例如:
- (void)parserDidEndDocument:(NSXMLParser *)parser
NSError *error = nil;
if (![managedObjectContext save:&error])
NSLog(@"Error saving %@", error);
这一切都很好,事实上我的程序正按照我现在想要的方式运行。但我的问题是,当托管对象上下文被保存时,项目似乎是随机添加的,这是上下文中第一个创建的对象,可能不是数据库中的第一行。我通过添加一个告诉我在 xml 中的位置的列来解决这个问题,然后在我的 fetchedResultsController 中简单地按此列进行排序。
我知道我可以在每次项目结束时保存上下文,但这听起来不是一个好方法,所以我只是在最后保存它们。
我的问题是为什么它们会随机添加?这是正常行为吗?谢谢。
-奥斯卡
【问题讨论】:
【参考方案1】:Core Data 的货币是NSSet*
个实例。集合是无序的,所以你添加然后取回的任何东西都会返回给你,没有任何内在的顺序。
因此,您只需在初始化NSFetchedResultsController
时应用NSSortDescriptor
。您可以应用任意数量的排序顺序,例如:
NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSSortDescriptor *firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:nil];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:lastNameDescriptor, firstNameDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[lastNameDescriptor release];
[firstNameDescriptor release];
...
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"keyInitial" cacheName:@"MyObjects"];
self.fetchedResultsController = aFetchedResultsController;
self.fetchedResultsController.delegate = self;
[aFetchedResultsController release];
[fetchRequest release];
NSError *error;
if (![self.fetchedResultsController performFetch:&error])
// handle error...
【讨论】:
【参考方案2】:这是正常行为。您可能还注意到,当您创建一个多对多关系时,相关属性是一个无序集合 (NSSet)。
当顺序很重要时,只需添加一个用于排序的数字属性即可。
【讨论】:
谢谢,我没有意识到这是一个 NSSet。以上是关于iPhone Core Data 一次保存多个项目的随机行为?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone Core Data 应用程序会终止需要保存的数据库吗?
如何在 Swift 中的 Core Data 中保存多个项目
iPhone Core Data 对象添加到 NSMutableArray