核心数据多对多,不会破坏关系或moc无法挽救

时间:2015-01-06 08:28:04

标签: ios core-data swift many-to-many

我在Swift中遇到了Core Data的麻烦。

我试图从对象中删除关系而不删除它,因为它必须仍然存在于其他关系中。 基本上我有相册中的照片,这些照片都有缩略图。 一张照片可以存在于许多相册中,一张相册可以有很多照片。

在我实现缩略图之前,这工作或似乎正在工作,虽然它可能永远不会有效,但现在只显示问题。目前它没有消除这种关系。

我添加缩略图的原因是因为完整的res图像很大。与此同时,我还将核心数据的提取请求更改为仅获取最小值,并将所需数据存储在元组中。之后我重置moc并尽可能多地返回nil。 不是超级快,但很轻。

在同一个函数中有多个获取请求是不是很糟糕?

感谢和抱歉,如果这是一个愚蠢的问题,也许我只是需要一些睡眠才能看到真正发生的事情!

我的方法:

制作一组可变的相册(与要获取的最小对象数量)相关的照片

从该集中删除当前相册

将更改后的内容保存为与其他相册的关系。


我的代码:

let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let moc:NSManagedObjectContext = appDel.managedObjectContext!

        let asPredicate = NSPredicate(format: "albumID = %@", albumTuple.iD)
        let asFetchRequest = NSFetchRequest(entityName: "Album")
        asFetchRequest.predicate = asPredicate
        let asResults = moc.executeFetchRequest(asFetchRequest, error:nil)!
        currentAlbum = asResults.last as Album

        var foundPhotos : NSMutableSet = currentAlbum.photos as NSMutableSet
        var foundThumbs : NSMutableSet = currentAlbum.thumbPhotos as NSMutableSet

        let tPredicate = NSPredicate(format: "thumbID = %@", thumbs[counter].iD)
        let tFetchRequest = NSFetchRequest(entityName: "Thumbnail")
        tFetchRequest.predicate = tPredicate
        let tResults = moc.executeFetchRequest(tFetchRequest, error:nil)!

        var thumbToDelete = tResults.last as Thumbnail
        foundThumbs.removeObject(thumbToDelete as Thumbnail)
        currentAlbum.thumbPhotos = foundThumbs

        let pPredicate = NSPredicate(format: "photoID = %@", thumbs[counter].iD)
        let pFetchRequest = NSFetchRequest(entityName: "Photo")
        pFetchRequest.predicate = pPredicate
        let pResults = moc.executeFetchRequest(pFetchRequest, error:nil)!

        var photoToDelete = pResults.last as Photo
        foundPhotos.removeObject(photoToDelete as Photo)
        currentAlbum.photos = foundPhotos

        moc.save(nil)

更新

我尝试在同一个函数中使用和不使用多个谓词和请求。没有区别。我尝试通过删除关系两端的对象来破坏关系。 moc save没有错误。删除对象后,我删除的对象的计数减少1。如果我然后刷新moc并重置它,则计数再次增加1。 因此,由于某种原因,moc无法识别我的托管对象并且不会破坏关系。

我投错了什么?有一个应该是变量的常量吗? 一个错字?或者它是Core Data本身的问题?我可以吓唬moc接受改变吗?

func deletePhoto () {
        let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let moc:NSManagedObjectContext = appDel.managedObjectContext!

        let asPredicate = NSPredicate(format: "albumID = %@", albumTuple.iD)
        let asFetchRequest = NSFetchRequest(entityName: "Album")
        asFetchRequest.predicate = asPredicate
        let asResults = moc.executeFetchRequest(asFetchRequest, error:nil)!
        currentAlbum = asResults.last as Album

        println("number of photos at start")
        println(currentAlbum.photos.count)

        let pPredicate = NSPredicate(format: "photoID = %@", thumbs[counter].iD)
        let pFetchRequest = NSFetchRequest(entityName: "Photo")
        pFetchRequest.predicate = pPredicate
        let pResults = moc.executeFetchRequest(pFetchRequest, error:nil)!

        var photoToDelete : Photo = pResults.last as Photo
        currentAlbum.photos.removeObject(photoToDelete as Photo)


        var error: NSError? = nil
        if moc.hasChanges && !moc.save(&error) {
            println("error")
            abort()
        }
        println("number of photos left")
        println(currentAlbum.photos.count)
    }

1 个答案:

答案 0 :(得分:0)

发现问题。

我的NSManaged Object子类具有与NSMutableSet类型的多对多关系,而不是NSSet。不要这样做。

我不知道为什么这种情况只与一对多关系有关,并且当有两个关系时停止工作。它根本不应该有用。