我在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)
}
答案 0 :(得分:0)
发现问题。
我的NSManaged Object子类具有与NSMutableSet类型的多对多关系,而不是NSSet。不要这样做。
我不知道为什么这种情况只与一对多关系有关,并且当有两个关系时停止工作。它根本不应该有用。