Tag: 核心数据

如何在NSPredicate中使用“ALL”聚合操作来过滤基于CoreData的集合

基于下面的数据模型 并基于用户input,我创build了一个名为selectedTags的实体标记的managedObjects的NSSet。 我的问题: [NSPredicate predicateWithFormat:@"ANY entryTags IN %@", selectedTags]; …这将返回至less有一个EntryTag在SelectedTags集中的任何条目。 我想要的东西是: [NSPredicate predicateWithFormat:@"ALL entryTags IN %@", selectedTags]; …注意唯一的变化是“任何”到“全部”。 这说明了我想要的,但不起作用。 为了制定我期望的结果: 我正在寻找一个解决scheme,将只返回入口的入口标签都在selectedTags列表(但在同一时间,如果可能的话,不一定是相反的方式)。 为了进一步说明: (标签)的妈妈 (标签)爸爸 (标签)礼品 (进入)她是她…..(标签)妈妈 (进入)他是一个他……..(标签)爸爸 (进入)礼物给妈妈…(标签:)妈妈,礼物 (入门)爸爸的礼物…..(标签:)爸爸,礼物 如果selectedTags包含“妈妈”和“礼物”,那么“爸爸的礼物”将会出现,因为它有“礼物”的标签。 我宁愿它不显示:)

将SQL存储添加到NSPersistentStoreCoordinator时如何debugging/处理间歇性的“授权被拒绝”和“磁盘I / O”错误?

我在应用程序商店中有一个应用程序,正在使用日志logging服务来获取崩溃日志和关联的日志数据。 我看到一个间歇性的崩溃(受影响的用户数量很less,每个用户的崩溃数量很低),但是让我感到困惑。 这些崩溃发生的事情如下: 应用程序启动并初始化核心数据堆栈 应用程序尝试使用以下代码( storeURL有效)将SQL存储添加到NSPersistentStoreCoordinator: NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption : @(YES), NSInferMappingModelAutomaticallyOption : @(YES) }; sqlStore = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]; 添加此存储时发生以下错误之一: NSError: 域名= NSCocoaErrorDomain 代码= 256“操作无法完成(cocoa错误256.)” UserInfo = 0x1dd946a0 {NSUnderlyingException =授权被拒绝,NSSQLiteErrorDomain = 23} 要么 NSError: 域名= NSCocoaErrorDomain 代码= 256“操作无法完成(cocoa错误256.)” UserInfo = 0xc6525d0 {NSUnderlyingException =磁盘I / O错误,NSSQLiteErrorDomain = 10} 在这种情况之后,应用程序将崩溃B / […]

Core Data父级ManagedObjectContext是否需要与子级上下文共享一个并发types?

我可以将我的ManagedObjectContext的父上下文设置为具有不同并发types的ManagedObjectContext吗? 例如: backgroundManagedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [backgroundManagedObjectContext_ setPersistentStoreCoordinator:coordinator]; managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [managedObjectContext_ setParentContext:backgroundManagedObjectContext_]; 我的目标是(希望)快速保存managedObjectContext_(因为它只需要将内容保存到父内存中),然后让backgroundManagedObjectContext_在自己的队列上保存。 除非我碰巧需要在“前台”队列中做另一个保存,否则在后台保存我的用户应该永远不会看到很长的保存时间。 我遇到了看起来像是死锁的问题,但我不确定它们是否与此相关,或者如果我的问题在其他地方。 我可以或多或less地可靠地产生僵局的一个地方的细节: 我有一个主线程的托pipe对象上下文,它是由一个带有私有队列并发types的托pipe对象上下文来支持的,而且它有一个持久存储。 我有一些实体types(约5),每个实体types与另一个实体有一个或两个双向关系。 我的应用程序想要使用iCloud(我已经为这些testing拨了这个代码),所以它不能提供预填充数据库,当它检测到一个空数据库时,它需要build立它。 所以,当我看到一个空的数据库(这是在主线程上检查),我添加了大约4或8,除了其中一个实体types,最后一个约100(所有的增加发生在主线程)。 主线程执行saveContext。 在完成之后(没有错误),它会要求其他托pipe对象上下文运行一个也执行saveContext的块。 这个saveContext绝对是一个僵局参与者。 这也是“背景”NSManagedObjectContext完成的唯一的东西。 在这之后,确切的控制stream是有点模糊的,因为NSFetchedResultsController(一个给定的实体types(有〜3个成员),一个简单的sorting,批量大小为20左右)驱动下一轮的Core Data活动,但是TableViewController会调用它需要pipe理的项目数量,即“获取的结果控制器有多less结果”。 这个电话是僵局的另一面。 (所有这些都在主线程中)

何时使用核心数据的NSMainQueueConcurrencyType?

初始化一个使用NSMainQueueConcurrencyType的NSManagedObjectContext仅适用于MOC有一个使用NSPrivateQueueConcurrencyType初始化的子MOC的情况? 为了给出一些背景知识:我的应用程序有一个传统的结构,主表视图是由NSOperation驱动的,而数据是使用具有自己的MOC的NSOperation子类从Web服务asynchronous导入的。 我不确定这种情况下的两个MOC是否应该使用NSConfinementConcurrencyType (我相信是默认的),或者主线程上的获取结果控制器的MOC是否应该使用NSMainQueueConcurrencyType ,后台MOC应该使用NSConfinementConcurrencyType 。

核心数据重置

我正在重新设置coreData中的数据,下面是我的代码来重置CoreData中的数据 – (void) resetApplicationModel { __managedObjectContext = nil; __managedObjectModel = nil; __persistentStoreCoordinator = nil; _allPageViewController.controller = nil; NSError *error; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"abc.sqlite"]; if ([[self.managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[self.managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]) { // remove the file containing the data if([[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]) { //recreate the store like in the appDelegate method if([self.persistentStoreCoordinator […]

在更新UITableView中显示的CoreData模型后,应用程序崩溃

我有一个奇怪的错误是非常罕见的,但会导致应用程序崩溃。 我不能复制它,但我终于find了一个崩溃报告logging这一点。 (我发布了下面的堆栈跟踪,我使用了一个截图,因为这里的引用函数搞乱了格式化,这是不可读的) 所以问题开始后点击一个button,调用方法closeButtonTapped 。 此方法应该淡出popup-view (称为ExtendBitPopupView )并保存用户input的文本(我的数据模型之一的details属性)。 这是closeButtonTapped方法: func closeButtonTapped(tap: UITapGestureRecognizer) { fadeOut { // fadeOut(completion:) just fades out the UI if self.infoTextView.text != "Enter details…" { self.entry.info = self.infoTextView.text self.appDelegate.saveContext() } } } 所以它需要用户input的文本并将其作为entry.info保存到数据库中。 现在,有一点上下文: ExtendBitPopupView是一个popup ,在UITableView上方显示,显示数据库中的所有entry对象。 它使用NSFetchedResultsController来pipe理数据。 该表不显示entry.info属性。 这只在ExtendBitPopupView可见 根据堆栈跟踪,应用程序在调用controllerDidChange方法时崩溃。 我想它调用这个方法,因为一个entry已经改变。 func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for […]

核心数据布尔键值更改不反映在提取

给定一个NSManagedObject子类,删除一个布尔属性(这是用两种不同的方式用下面的代码演示的,因为这两种方法都不起作用): [代码1] @interface MyManagedObject : NSManagedObject @property (nonatomic, retain) NSNumber *deleted; // Or @property (nonatomic) BOOL deleted; @end 创build并插入到Core Data中,如下所示: [代码2] metadata.deleted = [NSNumber numberWithBool:NO]; // metadata.deleted = NO; 并提取 [代码3] // setup entity description NSEntityDescription* entityDescription = [self entityDescription]; // setup the sorter NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; NSSortDescriptor* sortDescriptorSection = [[NSSortDescriptor […]

无法用types参数列表(Int64,String)调用setValue

我已经检查了这里的答案,谷歌和我难住。 func saveAvailableWord(word: GameWord) { let gw = NSEntityDescription.insertNewObjectForEntityForName("GameWord", inManagedObjectContext: persistence.managedObjectContext!) as! NSManagedObject let rId = word.rowID gw.setValue(rId, forKey: "rowID") //*** Error line } 上面的代码是针对核心数据的,只是试图创build一个对象。 但是我明白了 “不能用types为'(Int64,forKey:String)'的参数列表调用'setValue'' 在标记的行上。 rowID被定义为@NSManaged var rowID: Int64因为它来自SQLite的ROWID列。 如果我用一个简单的数字replacerIdvariables,错误就会消失。 我错过了什么? 我究竟做错了什么? 感谢您的时间和帮助。

核心数据更改不合并

我已经build立了一个非层次的双MOC架构(一个用于主线程,一个用于私有线程),并具有保存通知用于合并更改: – (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { NSManagedObjectContext* mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [mainContext setPersistentStoreCoordinator:coordinator]; [mainContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; _managedObjectContext = mainContext; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSaveMainQueueContext:) name:NSManagedObjectContextDidSaveNotification object:_managedObjectContext]; } return _managedObjectContext; } – (NSManagedObjectContext *)privateManagedObjectContext { if (_privateManagedObjectContext != nil) { […]

将PDF文件插入到核心数据中?

我正在使用我的应用程序导入一些PDF文件。 但我试图把我的PDF文件插入我的数据库。 我正在使用核心数据。 是否有可能做到这一点 ? 如果是这样,我该怎么办? 我必须使用哪种types(NSData,NSDocument,…?) 非常感谢! 🙂