无法从扩展中读取核心数据
Cannot read coredata from extension
我有一个应用程序可以在 coredata
中存储一些信息并读取它们。
我正在编写此应用程序的消息扩展程序,我想让此扩展程序读取相同的数据,但我的响应总是空的。
这是我在主应用程序中使用的代码:
context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
fetchImages(Date()){ (array, arrayData) in
for image in array{
imagesArray.insert(image, at:0)
}
}
我在扩展程序中使用了完全相同的代码,但它不读取数据。
我想知道的是我没有在代码中的任何地方使用 appGroupIdentifier
。
我该如何实现?
谢谢。
这里是fetchImages
函数的代码:
func fetchImages(_ predicate:Date, completion:(_ array:[Image], _ arrayData:NSArray)->()){
var arrData = [NSManagedObject]()
var existingImages = [Image]()
let request :NSFetchrequest<NSFetchrequestResult> = NSFetchrequest(entityName: "Photo")
do {
let results = try context?.fetch(request)
var myImage = Image()
if ((results?.count) != nil) {
for result in results! {
myImage.imageUrl = (resultat as! NSManagedObject).value(forKey:"url") as! String
myImage.imageFileName = (resultat as! NSManagedObject).value(forKey:"imageFileName") as! String
existingImages.append(myImage)
arrData.append(result as! NSManagedObject)
}
} else{
print ("No photo.")
}
completion(existingImages, arrData as NSArray)
} catch{
print ("Error during CoreData request")
}
}
打开应用组是第一步,但现在您需要告诉 Core Data 使用应用组。
首先,您从 FileManager
获取共享组容器的位置。使用 containerURL(forSecurityApplicationGroupIdentifier:)
获取目录的文件 URL。
如果需要,您可以不做任何更改地使用 URL。在其中创建一个子目录来保存您的 Core Data 文件可能是个好主意。如果这样做,请使用 URL
上的 appendingPathComponent()
方法将目录名称添加到 URL。然后用FileManager
用createDirectory(at:withIntermediateDirectories:attributes:)
方法新建目录
既然您有一个共享目录可以使用,请告诉 NSPersistentContainer
将其文件放在那里。您可以使用 NSPersistentStoreDescription
来做到这一点。初始化程序可以使用 URL 来告诉它在哪里存储数据。
您的代码将近似于此:
let directory: URL = // URL for your shared directory as described above
let containerName: String = // Your persistent container name
let persistentContainer = NSPersistentContainer(name: containerName)
let persistentStoreDirectoryUrl = directory.appendingPathComponent(containerName)
guard let _ = try? FileManager.default.createDirectory(at: persistentStoreDirectoryUrl, withIntermediateDirectories: true, attributes: nil) else {
fatalError()
}
let persistentStoreUrl = persistentStoreDirectoryUrl.appendingPathComponent("\(containerName).sqlite")
let persistentStoreDescription = NSPersistentStoreDescription(url: persistentStoreUrl)
persistentContainer.persistentStoreDescriptions = [ persistentStoreDescription ]
persistentContainer.loadPersistentStores {
...
}
我有一个应用程序可以在 coredata
中存储一些信息并读取它们。
我正在编写此应用程序的消息扩展程序,我想让此扩展程序读取相同的数据,但我的响应总是空的。
这是我在主应用程序中使用的代码:
context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
fetchImages(Date()){ (array, arrayData) in
for image in array{
imagesArray.insert(image, at:0)
}
}
我在扩展程序中使用了完全相同的代码,但它不读取数据。
我想知道的是我没有在代码中的任何地方使用 appGroupIdentifier
。
我该如何实现?
谢谢。
这里是fetchImages
函数的代码:
func fetchImages(_ predicate:Date, completion:(_ array:[Image], _ arrayData:NSArray)->()){
var arrData = [NSManagedObject]()
var existingImages = [Image]()
let request :NSFetchrequest<NSFetchrequestResult> = NSFetchrequest(entityName: "Photo")
do {
let results = try context?.fetch(request)
var myImage = Image()
if ((results?.count) != nil) {
for result in results! {
myImage.imageUrl = (resultat as! NSManagedObject).value(forKey:"url") as! String
myImage.imageFileName = (resultat as! NSManagedObject).value(forKey:"imageFileName") as! String
existingImages.append(myImage)
arrData.append(result as! NSManagedObject)
}
} else{
print ("No photo.")
}
completion(existingImages, arrData as NSArray)
} catch{
print ("Error during CoreData request")
}
}
打开应用组是第一步,但现在您需要告诉 Core Data 使用应用组。
首先,您从 FileManager
获取共享组容器的位置。使用 containerURL(forSecurityApplicationGroupIdentifier:)
获取目录的文件 URL。
如果需要,您可以不做任何更改地使用 URL。在其中创建一个子目录来保存您的 Core Data 文件可能是个好主意。如果这样做,请使用 URL
上的 appendingPathComponent()
方法将目录名称添加到 URL。然后用FileManager
用createDirectory(at:withIntermediateDirectories:attributes:)
方法新建目录
既然您有一个共享目录可以使用,请告诉 NSPersistentContainer
将其文件放在那里。您可以使用 NSPersistentStoreDescription
来做到这一点。初始化程序可以使用 URL 来告诉它在哪里存储数据。
您的代码将近似于此:
let directory: URL = // URL for your shared directory as described above
let containerName: String = // Your persistent container name
let persistentContainer = NSPersistentContainer(name: containerName)
let persistentStoreDirectoryUrl = directory.appendingPathComponent(containerName)
guard let _ = try? FileManager.default.createDirectory(at: persistentStoreDirectoryUrl, withIntermediateDirectories: true, attributes: nil) else {
fatalError()
}
let persistentStoreUrl = persistentStoreDirectoryUrl.appendingPathComponent("\(containerName).sqlite")
let persistentStoreDescription = NSPersistentStoreDescription(url: persistentStoreUrl)
persistentContainer.persistentStoreDescriptions = [ persistentStoreDescription ]
persistentContainer.loadPersistentStores {
...
}