Tag: nsfetchedresults

核心数据sectionNameKeyPath与关系属性性能问题

我有一个包含三个实体的核心数据模型: Person , Group , Photo与他们之间的关系如下: 人<< ———–>小组(一对多关系) 人<————->照片(一对一) 当我使用UITableView的NSFetchedResultsController执行提取操作时,我想要使用Group的实体name属性在部分中对Person对象进行Group 。 为此,我使用sectionNameKeyPath:@"group.name" 。 问题是,当我使用Group关系中的属性时, setFetchBatchSize: 20以小批量20(我有setFetchBatchSize: 20 )取得一切,而不是在滚动tableView取批。 如果我使用Person实体的属性(如sectionNameKeyPath:@"name" )来创build节,一切正常: NSFetchResultsController在我滚动时加载小批量的20个对象。 我用来实例化NSFetchedResultsController的代码: – (NSFetchedResultsController *)fetchedResultsController { if (_fetchedResultsController) { return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:[Person description] inManagedObjectContext:self.managedObjectContext]; [fetchRequest setEntity:entity]; // Specify how the fetched objects should be […]

NSFetchedResultsController在每个字母中有单独的部分标题的AZ索引?

我有一个NSFetchedResultsController从核心数据结构,相册列表中提取数据。 它目前是由艺术家sorting,所以所有的A,B等我想添加一个索引,以便用户可以快速跳转到每个字母,我使用下面的代码来做到这一点。 问题在于节标题现在是“A”,“B”,“C”等,这意味着我已经按照字母顺序丢失了部分标题(“Adele”,“America “,”披头士乐队“等) 我希望索引使用字母A到Z,但节标题按字母顺序显示艺术家名称。 然后在索引中推送一封信,然后跳转到第一个带有该字母的艺术家。 我怎样才能做到这一点(在索引字母字符,但部分标题不同的属性)? 编辑:如果我将我的sectionNameKeyPath设置为我的author字段,AZ索引是可见的,但字母不同步到名称,例如,如果我点击S,它需要我以艺术家开始与AL,或攻G我到AB。 我不太确定这是为什么,也许该部分索引是搞砸了? 以下是我正在使用的代码: 在我的NSManagedObject子类中: – (NSString *) firstLetter { [self willAccessValueForKey: @"firstLetter"]; NSString *firstLetter = [[[self author] substringToIndex: 1] uppercaseString]; [self didAccessValueForKey: @"firstLetter"]; return firstLetter; } 在我的视图控制器中,创buildFRC: NSFetchedResultsController *byAuthorFRC = [[NSFetchedResultsController alloc] initWithFetchRequest: _fetchRequest managedObjectContext: [[CDManager sharedManager] managedObjectContext] sectionNameKeyPath: @"firstLetter" cacheName: nil]; 这里是我的sectionIndexTitlesForTableView:方法: – (NSArray *) sectionIndexTitlesForTableView: (UITableView […]

在保持NSFetchedResultControllerfunction的同时保存单个CoreData实体(不是整个上下文)

唷,对于长头衔感到抱歉。 我有一个单独的托pipe对象上下文,我存储从两个不同的位置派生的歌曲。 我从手机上的永久性存储(使用核心数据)中获得一些歌曲,并从一个在线数据库中提取一些歌曲。 这两首歌都是相同的MananagedObject子类。 我希望这两首歌都在一个上下文中,因为我希望它们都显示在与NSFetchedResultsController连接的表视图上。 当我想保存其中一首歌曲时出现问题。 我不想将所有从在线数据库中提取的歌曲保存到手机中。 我只是想保存单曲,所以一个简单的[moc保存]不起作用。 另一个问题是,我保存单曲后,我仍然希望从网上拉的歌曲是在上下文(但再次,没有保存)。 我相信我有几个不同的select: 1)有可能有NSFetchedResults控制器连接到多个上下文? 2)我可以将从在线数据库中提取的所有歌曲移到单独的临时上下文中,保存在原始上下文中,然后将所有歌曲移回。 (请参阅: 如何将NSManagedObject从一个上下文复制或移动到另一个上下文? ) 3)记住在线歌曲的所有键值对,从上下文中删除在线歌曲,保存原始上下文,根据已保存的键值对将所有在线歌曲重新插入原始上下文。 4)我是一个巨大的n00b,我错过了一些更容易。 谢谢!

使用Core Data Swift对TableView和行进行分区

我在sqlite中有两个表: 代码由XCode Generation生成: class Event: NSManagedObject { @NSManaged var startDate: NSDate @NSManaged var details: EventDetail //i think this property shoud be var details Array<EventDetail> am i correct? } class EventDetail: NSManagedObject { @NSManaged var title: String @NSManaged var location: String @NSManaged var note: String @NSManaged var endDate: NSDate @NSManaged var event: NSManagedObject } 我想把事件放在section中 ,而eventDetails放在行中 […]

NSFetchedResultsController节使用显示顺序sorting

我目前有一个选项,允许用户更改我的iPhone应用程序中的类别的显示顺序。 我想使用NSFetchedResultsController部分表视图,以便部分标题是“category.displayOrder”sorting的“category.name”,其中“category”与我正在提取的实体具有TO-ONE关系。 我可以正确使用部分的唯一方法是使用“category.displayOrder”作为部分标题。 NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.displayOrder" ascending:YES]; NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; [fetchRequest setFetchBatchSize:10]; NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.name" cacheName:nil]; 任何想法如何我可以命名不同的部分标题,然后我sorting的属性?

试图插入nil对象的NSFetchedResultsController

编辑7: 这是我的保存方法。 这是漂亮的样板。 DEBUG_LOG()macros只在debugging版本时才被执行。 – (void)saveManagedObjectContext:(NSManagedObjectContext *)moc { if ([moc hasChanges]) { DEBUG_LOG(@"Saving managed object context %@", moc); NSError *error; BOOL success = [moc save:&error]; if (!success || error) { DEBUG_LOG(@"ERROR: Couldn't save to managed object context %@: %@", moc, error.localizedDescription); } DEBUG_LOG(@"Finished saving managed object context %@", moc); } else { DEBUG_LOG(@"Managed object context […]

如何正确修剪由NSFetchedResultsController引入的对象图?

如果没有引用周期, NSFetchedResultsController可以在不需要的时候正确地将它的pipe理对象变成错误。 但是参考周期不是,所以我不得不自己再次错误的对这些对象。 但是,手动重新创build由NSFetchedResultsControllerpipe理的对象是危险的 。 所以我想知道你的Core Data专家认为是修剪NSFetchedResultsController引入的对象graphics的最佳方法。 谢谢。 更新: 我相信通常FRC应该能够重新故障对象,即使在参考周期。 我的印象是,这并不是因为2012年向苹果公司报告的一个旧的bug,其状态仍然是开放的:FRC从来不会重新插入新插入的对象(保存之后),所以我必须手动重新排除它们。 这是我的testing项目: http : //d.pr/f/Ohe3 。

我如何解决NSInternalInconsistencyException',原因:'+ entityForName:失败报告

我的代码如下所示: NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity]; NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; // If appropriate, configure the new managed object. [newManagedObject setValue:[NSDate date] forKey:@"date"]; // Save the context. NSError *error = nil; if (![context save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } 在.h头文件中我有这个: @interface TretiViewController […]

获取NSFetchedResultsController,NSSortDescription和sectionNameForKeyPath一起工作

我目前正在研究一个有两个实体和关系的应用程序,如下所示: 项目 << – > 类别 。 我目前正在获取项目实例,并使用该项目的category.name部分显示它们。 在这种情况下,我可以使用sorting描述符按名称对类别进行sorting,这非常简单,工作正常(下面的相关代码): -(NSFetchedResultsController*)fetchedResultsController { if (fetchedResultsController_ != nil) return fetchedResultsController_; NSManagedObjectContext *moc = [order_ managedObjectContext]; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:moc]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; [sortDescriptors release]; [sortDescriptor […]

NSFetchedResultsController是否观察到永久存储的所有更改?

我的程序工作如下链接: 更新NSFetchedResultsController的结果而不需要新的提取 将NSFetchedResultsController的结果显示给UITableView 从Web服务获取新的对象,并将其存储到核心数据(在相同的视图控制器,与RestKit) 更新表视图与NSFetchedResultsController委托的通知 NSFetchedResultsControllerDelegate的实现是从Apple的Core Data项目复制的,我的预测是: [NSPredicate predicateWithFormat:@"isMyTest == TRUE"] 如果属性更新从TRUE变为FALSE,则它将从tableview中删除行(因为该行的对象位于fetchedObjects中) 但是,如果属性更新从FALSE变为TRUE,则NSFetchedResultsController不通知任何内容,因此新的数据不能在表视图中看到。 如果我手动更新NSFetchedResulsController和UITableView,它会显示新的数据。 我以为NSFetchedResultController监视持久存储中的所有更改,这是太大的希望? :d (我真的想这样做,因为其他视图控制器可以更新持久性存储,那么很难更新视图控制器。) 如果是这样,你可以让我知道我怎么能更好地更新NSFetchedResultsController? (更新) 在参考NSfetchedResultsController,我读了下面的单词: 因此,控制器有效地具有三种操作模式,由是否具有委托以及是否设置了高速caching文件名来确定。 没有跟踪:代表被设置为零。 控制器只是提供对数据的访问,就像执行提取时一样。 仅内存跟踪:代理非零,文件caching名称设置为零。 控制器监视其结果集中的对象,并更新部分和响应相关更改的sorting信息。 完全持久跟踪:委托和文件caching名称不为零。 控制器监视其结果集中的对象,并更新部分和响应相关更改的sorting信息。 控制器维护其计算结果的持久caching。 “完全持续跟踪”并不意味着我想要什么? 我设置了cacheName,但是它的工作原理是一样的。