问题标签 [nspersistentstore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
376 浏览

core-data - 在 Swift 3 中实现 fetchedresultsviewcontroller

我正在尝试在 Swift 3 中实现 fetchedresultsviewcontroller,并且在将控制器的委托属性设置为 self 时遇到以下错误:

无法将“SomeRootViewController”类型的值分配给“NSFetchedResultsControllerDelegate”类型?

SomeRootViewController.swift

有人可以向我解释这个问题以及如何解决它吗?

0 投票
2 回答
286 浏览

ios - 如何使用 NSInMemoryStoreType 清理 NSPersistentStoreCoordinator 的内存对象图?

我使用NSInMemoryStoreTypeforNSPersistentStoreCoordinator来维护内存中的实体和关系,因为我不想将其写入磁盘。

因此,由于核心数据对象引用仍在内存中,所以我计划在某些时候清理内存中的对象图,因为应用程序内存不断增加。

如何从内存对象图中删除/重置/删除整个核心数据实体和关系以清理应用程序内存使用情况?

在需要时是否有任何优化的方法来处理NSInMemoryStoreType和清理内存?

请注意:我的应用程序的部署目标是 iOS 8.0 及更高版本。所以清理 API 也应该可用于 iOS 8 目标。

谢谢!

0 投票
0 回答
144 浏览

ios - 迁移具有不同保护级别的辅助核心数据存储

我目前正在加密核心数据存储。

最终目标是拥有一个具有FileProtectionType.Complete最大保护的存储,但有些任务可能会在后台完成,这意味着受保护的数据不可用,因此无法将其保存到主存储。

我当前的过程是,当受保护的数据不可用时,将更改保存到带有FileProtectionType.completeUnlessOpen.

然后,当受保护的数据再次可用时 ( func applicationProtectedDataDidBecomeAvailable(_ application: UIApplication)),将辅助存储合并回主存储。

这似乎在某种程度上有效,但不是我希望的那样。

例如:

在主商店中,我创建User并设置了名字和姓氏字段。

在后台,受保护的数据变得不可用后,我会更新名字和姓氏字段。由于受保护的数据不可用,因此将其保存到辅助存储中。

当受保护的数据再次可用时,我使用以下内容将两个存储合并在一起:

然后这似乎User在主商店中创建了一个新的,而不是像我希望的那样做并更新现有的User.

所以我的问题有两个:

1)这是处理我解释的场景的最佳方法吗?

2) 我将如何着手使迁移更新现有User而不是创建新的?会是创建自定义的情况MigrationManager吗?

我查看了无数其他 StackOverflow 问题,以帮助我了解我现在在正确时间使用这两个商店的点,并将它们合并到当前级别,包括但不限于以下内容:

合并两个 iOS 核心数据持久存储的有效方法是什么?

在后台使用 Core Data 加密

https://developer.apple.com/documentation/foundation/nsfileprotectiontype?language=objc

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html#//apple_ref/doc/uid/TP40004399-CH1-SW1

0 投票
2 回答
877 浏览

core-data - NSInMemoryStoreType 与 NSBatchDeleteRequest 不兼容吗?

我目前正在对与 Core Data 交互的层进行单元测试。它保存、删除和更新Item对象。但是,我尝试保存几个Items 然后执行批量删除的测试一直失败。

这是Item

这是与核心数据交互的对象,CoreDataStack

这是使用 Core Data 管理持久性的对象:

这是CoreDataStack我用于测试的子类,它包含一个内存存储:

最后,这是不断失败的测试:

问题

NSInMemoryStoreType 与 NSBatchDeleteRequest 不兼容吗?

如果不是,那么我做错了什么导致我的测试反复失败?

0 投票
1 回答
55 浏览

ios - NSManagedContext 返回旧数据而不是新数据

在我的应用程序中,我使用了 NSManagedContext 的双模型。有一个孩子managedObjectContextNSMainQueueConcurrencyType父母 writerManagedObjectContext一起NSPrivateQueueConcurrencyType将数据保存到PersistentStoreCoordinator. 我能够将数据保存在数据库中,但是在检索时我得到的是旧值而不是新值。

下面的代码是将上下文保存到parent context然后保存到PersistentStoreCoordinator.

在 stack-overflow 上发现了同样的问题,但它的答案对我的问题没有帮助。有谁知道该怎么做?

0 投票
1 回答
581 浏览

core-data - 使用 NSPersistentContainer viewContext 保存到磁盘?

如果我有大量数据,使用 viewContext 保存到持久存储中是否安全?例如,我的临时背景上下文中有 1000 条记录,它是 NSPersistentContainer 的 viewContext 的子项。一旦我在 bg 上下文中保存了所有 1000 条记录,我想使用 viewContext 将其保存在数据库中。这是正确的方法还是我应该创建一个后台上下文来保存到持久存储?

0 投票
0 回答
132 浏览

swift - 使用 Core Data 读取 SQLite 数据库时出错

我有中间数据库,我在应用程序中预加载,然后我使用轻量级迁移来更新这个数据库,但是当我第一次调用 NSPersistentStoreCoordinator 时,我有一个错误“数据库磁盘映像格式错误”

对于预加载数据库,我在 AppDelegate didFinishLaunchingWithOptions 中使用以下代码

然后对于轻量级迁移,我使用新的核心数据模型 v 2 并将此代码添加到 persistentStoreCoordinator

我做错了什么或如何解决这个问题?当我通过 Xcode 在设备上启动应用程序时,更新和安装始终有效,而当我使用 TestFlight 版本时,更新和安装无效......

0 投票
1 回答
239 浏览

ios - 如何使用当前的 NSPersistentStore 方法在本地和 iCloud 中创建可共享的 Core Data .sqlite 备份

我一直在寻找正确的方法来创建由 Core-Data 支持的 .sqlite 文件的备份并将该备份存储在本地和/或 iCloud(无论用户喜欢什么)中,以供下载、恢复或分享。让我先声明一下,我不是在谈论将持久存储移动到 iCloud 以供应用程序用作其数据源。我只是在询问有关在此问题中创建备份文件的问题。

2014 年,Apple 将 Core Data SQLite 存储的默认日志模式更改为 WAL。

https://developer.apple.com/library/content/qa/qa1809/_index.html

随着这一变化,他们建议:

要安全地备份和恢复 Core Data SQLite 存储,您可以执行以下操作:使用 NSPersistentStoreCoordinator 类的以下方法,而不是文件系统 API,来备份和恢复 Core Data 存储:- (NSPersistentStore *)migratePersistentStore:( NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

请注意,这是我们推荐的选项。

在此之前,我一直使用 NSFileManager 创建备份。有了这个建议,我相信在本地创建备份的正确方法是添加一个新的持久存储,然后分别使用 NSPersistentStoreCoordinator 方法 和 将该持久存储迁移到所需的备份addPersistentStoreWithType:configuration:URL:options:error位置migratePersistentStore:toURL:options:withType:error

我的问题有两个:

  1. 我以前会在导出数据之前将数据压缩到 NSData,然后将 NSData 直接写入文件。我的文件扩展名将是我的应用程序自定义的,用于通过电子邮件或其他 iOS 共享方法共享压缩数据。使用该 migratePersistentStore:toURL:options:withType:error方法,我现在在所需位置得到一个 .sqlite 文件(及其相应的 WAL 文件等),但我现在不知道如何共享此文件。如果我压缩文件,我会不会有丢失我努力保存的数据的危险 migratePersistentStore:toURL:options:withType:error?我相信是这样,但我确实想让我的用户通过电子邮件等方式共享/保存他们的备份,我现在不知道如何最好地解决这个问题。
  2. 我很难理解如何 migratePersistentStore:toURL:options:withType:error将文件备份到 iCloud。就像上面的共享示例一样,我看到我可以使用 addPersistentStoreWithType:configuration:URL:options:error, 并 migratePersistentStore:toURL:options:withType:error在本地获取所需的 .sqlite 副本,但是如果我尝试将该本地文件上传到 iCloud,我担心我会丢失我努力保存的数据使用migratePersistentStore:toURL:options:withType:error首先。我一直在尝试查看是否可以/应该使用一种方法 migratePersistentStore:toURL:options:withType:error将新创建的 persistentStore 直接移动到 iCloud,但我无法找到任何有关如何执行此操作或是否应该在全部。是否有我需要使用的特定 url 来指示persistentStore 的目的地是 iCloud?

对于这些问题的答案,我将不胜感激任何可以分享的见解。

0 投票
0 回答
385 浏览

ios - 在 NSPersistentStoreCoordinator 上调用 destroyPersistentStore 后,我应该删除底层持久存储文件吗?

我正在迁移我的 iOS 应用程序以使用NSPersistentContainer. 默认情况下,此类将其持久存储文件定位在Library/Application Support目录中;以前我的商店文件存储在Documents目录中。

如果在旧目录中找到存储文件,我添加了一些代码来移动存储文件:

调用后destroyPersistentStore(at: url),存储文件仍然存在于磁盘上。这些会在某个时候自动清理吗?还是我应该删除它们?我还应该删除.sqlite-shm.sqlite-wal文件吗?

0 投票
1 回答
813 浏览

ios - 恢复核心数据

我已经设法使用以下代码创建了我的 PersistentStore 的本地备份:

这似乎有效。备份文件已创建。这个答案: 在本地备份核心数据,并从备份中恢复 - Swift 建议我需要释放我的 NSPersistentContainer 然后使用 replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType:) 来恢复我的备份。所以我尝试这样:

这似乎没有任何作用。我没有收到任何错误或警告,但它似乎也没有在我备份它时恢复我的核心数据。

抱歉,我知道这可能是糟糕的代码。实际上,我完全使用 FileManager 实现了我想要的结果,但这似乎让我的控制台非常生气。我想正确地做到这一点,没有任何警告。