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

Core Data 没有第一次保存

iPhone 上是不是存在 Core Data?或者您将如何在 iPhone 上保存数据?

iPhone 4 iOS 5 如何使用 Core Data 保存 MPMediaItem?