ios - 无法从扩展中读取核心数据

标签 ios swift core-data share-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 {
    ...
}

关于ios - 无法从扩展中读取核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671559/

相关文章:

ios - CoreData 返回空对象集

android - 将 Xamarin.Android 项目转换/移植到 Xamarin.iOS

ios - 如何在 Swift 中以编程方式更改设备方向?

xml - 在后台线程上将 XML 解析为 CoreData 以不锁定 UI

ios - 核心数据中的谓词搜索会在第二次通过时导致 SIGABRT。 NSBetweenPredicateOperator类型

ios - MPMoviePlayerController 仅显示黑屏 - Swift

ios - UITableViewCell中图片的宽度随点击变化

ios - 来自 iOS 客户端的 Django 身份验证

ios - iOS 10.0.1推送通知自定义声音无法播放(mp3)

Swift Realm 返回零对象