Tag: core data

良好的iOS核心数据堆栈

我当时正在编写一个新的仅限iOS 10+的核心数据堆栈,并认为我将展示该过程变得多么简单。 数据协调员 我真的很想让一个人来管理核心数据堆栈。 传统上总是调用此CoreDataManager。 现在,将其命名为DataCoordinator。 最终课程DataCoordinator { 私有静态var协调器:DataCoordinator? 公共类func sharedInstance()-> DataCoordinator { 如果协调员==无{ 协调器= DataCoordinator() } 返回协调员! } 私人init(){ } } 3层架构 TL; DR跳至下一部分。 这不再是必需的。 现在我们需要设置一个核心数据栈。 我们需要有2个堆栈或2个上下文。 用于在主线程中读取和显示数据。 用于主要通过api调用和其他后台进程写入数据 这是通过使用3层体系结构来最佳实现的。 P1用于保存到持久性存储。 C1,C2是P1的子上下文。 C2用于从API写入。 以便将保存的更改快速传播到C1。 C1更改将传播到P1。 作为其子上下文。 传播速度很快,并且写入持久性存储的操作是在另一个上下文中进行的。 C1中的操作相当快。 这是建立3层架构的整体目标。 性能! 所有这些都不再需要设置。 NSPersistentContainer iOS 10引入了新的NSPersistentContainer类,该类将建立3层架构的所有样板代码减少到下面几行。 …公共变量容器:NSPersistentContainer 私人init(){ 容器= NSPersistentContainer(名称:“模型”) container.loadPersistentStores(completionHandler:{{_,error)在 如果让错误=错误{ fatalError(“未解决的错误\(错误)”) } }) } […]

NSFetchedResultsController与NSPredicate不更新

我从Core Data-base获取数据并将它们呈现在UITableView 。 我使用NSFetchedResultController来获取数据。 我希望用户能够在数据库中搜索,为此我使用NSPredicate 。 数据显示在UITableView ,一切正常,直到我将NSPredicate设置为NSPredicate 。 我在ViewDidLoad方法中使用它: self.fetchedResultsController = nil; fetchedResultsController_ = nil; NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@”Unresolved error %@, %@”, error, [error userInfo]); exit(-1); } 当用户从UITextField输入文本时,该文本将转到新的NSPredicate 。 这是在搜索开始时完成的: NSPredicate *pred = nil; pred = [NSPredicate predicateWithFormat:@”(Designation BEGINSWITH ’22’)”]; [fetchedResultsController_.fetchRequest setPredicate:pred]; NSError *error = nil; if (![[self […]

NSFetchedResultsController似乎是插入空的对象数组?

我不确定发生了什么问题。 我的数据模型中有一个实体,名为Quote,其中大约3000个存储在.sqlite中。 我只是试图通过NSFetchedResultsController的方式获得这些实体的属性之一到一个UITableView的单元格。 我得到的错误是在这行代码: NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest: fetchRequest managedObjectContext: [self managedObjectContext] sectionNameKeyPath: nil cacheName: @""]; 看来问题在于它试图将一个空对象加载到数组中。 我猜这意味着它没有find.sqlite文件中的对象。 这可能是这样吗? 如果是这样,我该如何开始追查为什么可能呢? 这里有一些代码,如果你需要更多,请问: 从AppDelegate.m: – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *nav = (UINavigationController *) self.window.rootViewController; FQQuotesTableViewController *quotesTableViewController = (FQQuotesTableViewController *) [[nav viewControllers] objectAtIndex: 0]; quotesTableViewController.managedObjectContext = self.managedObjectContext; quotesTableViewController.test = @"Hello!"; return YES; } – […]

iOS同步 – 核心数据对象知道必须推送到服务器的好方法是什么?

我正在构buildiPad和Web服务器之间的同步function。 我正在使用一个非常接近这里描述的方法。 我只有一种types的对象,我们称之为“故事”,它必须被同步。 它是一个核心数据实体(被pipe理对象)。 我必须解决的其余问题是知道“什么时候发生了变化,需要与服务器同步”。 一种方法是去find修改故事的每一段代码,并设置一些需要同步的标志。 这似乎并不优雅,似乎随着时间的推移,开发人员可能会忘记更新新的修改types的标志。 核心数据对象是否有观察自己的方法,所以任何时候做任何改变,都会执行一个特定的方法? 这会让这很容易。 另一种select是在对托pipe对象上下文进行保存操作之前使用isUpdated方法。 你要么只需要在一个地方叫保存,要么在保存的每个地方都做这个(听起来像是第一个选项)。 我想我可以做一个帮助器方法,通过所有的故事对象保存之前,看看他们是否需要他们的国旗设置。 唯一的缺点就是我会遍历系统中的所有Story对象来保存任何东西,即使对于一个Story也没有任何关系。 无论如何,我会停止尝试大声猜测解决scheme – 有没有人有一个很好的方法来做到这一点的经验?

IOS Coredata检查属性是否存在

我正在开发基于coredata和XMLparsing[RSS提要]的项目。 我必须检查,如果属性值可用或不在coredata? 例如 :- 我在我的数据模型中有3个属性。 名称,websitename和feedurl。 现在我不得不parsing与用户input的url。 但在parsing时,我想检查,如果URLNAME在coredata中可用或不。 如果可用,则parsing将在没有插入coredata的情况下完成,并且如果URL不在coredata中,则它将被插入到coredata中。 这里是我从哪里能够在核心数据中插入url的尝试。 但是用这个方法同样的url也进入了coredata。 – (void)feedParserDidFinish:(MWFeedParser *)parser { [HUD hide:YES]; //**Coredata inserting value**// NSManagedObjectContext *context = [self managedObjectContext]; // Create a new managed object NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"I" inManagedObjectContext:context]; [newDevice setValue:self.Name forKey:@"name"]; [newDevice setValue:self.WebsiteName forKey:@"websitename"]; [newDevice setValue:self.Feedlink forKey:@"feedurl"]; NSError *error = nil; // Save the object to […]

如何防止temporaryContext与migratePersistentStore同时运行

我有一个代码部分,我调用migratePersistentStore ,我想阻止任何temporaryContext在同一时间做任何事情,如何? 我的想法是基于semaphore和dispatch_group 。 代码A: dispatch_group_wait(dgLoadMain, DISPATCH_TIME_FOREVER) dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) mainMOC!.performBlockAndWait({ mainMOC!.persistentStoreCoordinator!.migratePersistentStore(/* … */) }) dispatch_semaphore_signal(semaLoadMain) 代码B: dispatch_group_enter(dgLoadMain) dispatch_semaphore_wait(semaLoadMain, DISPATCH_TIME_FOREVER) dispatch_semaphore_signal(semaLoadMain) let context = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) context.parentContext = mainMOC var context: NSManagedObjectContext context.performBlockAndWait({ // .. some code I do not want to run when migrating persistent store context.save(nil) }) mainMOC.performBlockAndWait({ mainMOC.save(nil) }) dispatch_group_leave(dgLoadMain) 你怎么看待这件事? 任何bette解决scheme? 在这种情况下可以使用dispatch_barrier_async吗?

完整CoreData上传(备份)到iCloud驱动器,并在需要时进行恢复

我的项目是基于CoreData的应用程序。 上传sqlite文件到CloudDrive是否足以在需要时恢复数据? 有没有教程如何实现它?

实现核心数据watchOS 2.0

我是WatchKit的新手,我试图将Core Data添加到我的WatchKit扩展中。 到目前为止,我已经在WatchKit扩展中创build了一个Data Model,但是我坚持实现Core Data的其余部分。 是创build核心数据模型和初始化与iOS相同的核心数据堆栈的过程,还是我应该注意到的任何差异? 另外,我是否在ExtensionDelgate.swift初始化核心数据堆栈,还是应该在其他地方初始化它?

将Core Data中的一个实体同步到iCloud

我是一名iOS开发人员,正在尝试使用iCloud和Core Data作为阅读器应用程序。 我为两个实体设置了核心数据,一个用于一个项目,另一个用于频道。 频道实体包含我将用于将用户的订阅网站同步到所有设备的信息。 在我自己的研究中,我只find了一种在Core Data中同步两个实体的方法。 我的问题是: 是否有可能只同步一个核心数据实体到iCloud? 我可以发布我的代码,如果它会帮助。

如何使用NSCoding在我的应用程序中保存/加载数据?

是的,我已经浏览了许多类似于此问题的问题。 不过,我还是不太明白发生了什么事,至less我不知道如何在我的申请中做到这一点。 所以基本上我的“实践”应用程序有一个主视图控制器,显示两个文本标签。 这些文本标签由一个拥有大型数组的NSObject类填充。 用户在他们想要去的数组中input数字,数组中索引处的string成为一个标签中的文本,而用户input的数字成为另一个标签中的文本。 用户也可以通过按下一个button来从数组中“collections”一个string。 当这种情况发生时,string和索引号被添加到驻留在主视图控制器中的两个单独的可变数组中。 然后,当用户想要看到他们所有的“collections夹”,他们可以滑动(模态)调出具有所有用户的“喜欢的string”的可用视图。 这是通过使用导航控制器/ segue将数据(2个可变数组)从主视图控制器传递到uitableviewcontroller来实现的。 此时,uitableviewcontroller中有两个可变数组,它们包含来自主视图控制器的string和索引号。 然后使用委托/协议将该数据传回给主视图控制器,以在主视图控制器的标签上设置文本(在用户点击可用视图的行中)。 我build立应用程序没有问题; 一切正常。 但我不知道如何保存数据,以便当用户退出应用程序并重新打开它时,仍然可以看到表格视图以及所有他们喜欢的string。 另外,我只是假设在我的情况下,我应该使用NSCoding; 如果,但是,我需要使用核心数据或其他任何东西,然后让我知道。 如果有人能帮助我,我真的很感激。 非常详细的解释请,如果可能的话,示例代码。