核心数据多对多,不会破坏关系或 moc 不保存
Core Data Many to Many, wont break relationship or moc doesn't save
我在 Swift 中遇到了核心数据的一些问题。
我试图从一个对象中移除一个关系而不删除它,因为它必须仍然存在于其他关系中。
基本上我的相册里有照片,这些照片有缩略图。
一张照片可以存在于多个相册,一个相册可以有很多照片。
在我实施缩略图之前,它正在工作或似乎在工作,尽管它可能永远不会工作,而且问题只是现在才出现。目前它并没有消除这种关系。
我添加缩略图的原因是全分辨率图像太大。同时,我还将我的获取请求从核心数据更改为只获取最低限度的数据并将所需的数据存储在一个元组中。之后,我尽可能将 moc 和 return 重置为零。
不是很快,但很轻。
那么在同一个函数中有多个获取请求是不是很糟糕?
谢谢,抱歉,如果这是一个愚蠢的问题,也许我只是需要睡一觉,看看到底发生了什么!
我的方法:
制作一组与照片相关的可变相册(要获取的对象的最少数量)
从该集合中删除当前专辑
将更改后的集合保存为与其他相册的关系。
我的代码:
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)
}
找到问题了。
我的 NSManaged Object 子类与 NSMutableSet 类型而不是 NSSet 有一对多关系。不要这样做。
我不知道为什么这只适用于一个多对多关系,而当有两个关系时就停止工作了。它根本不应该起作用。
我在 Swift 中遇到了核心数据的一些问题。
我试图从一个对象中移除一个关系而不删除它,因为它必须仍然存在于其他关系中。 基本上我的相册里有照片,这些照片有缩略图。 一张照片可以存在于多个相册,一个相册可以有很多照片。
在我实施缩略图之前,它正在工作或似乎在工作,尽管它可能永远不会工作,而且问题只是现在才出现。目前它并没有消除这种关系。
我添加缩略图的原因是全分辨率图像太大。同时,我还将我的获取请求从核心数据更改为只获取最低限度的数据并将所需的数据存储在一个元组中。之后,我尽可能将 moc 和 return 重置为零。 不是很快,但很轻。
那么在同一个函数中有多个获取请求是不是很糟糕?
谢谢,抱歉,如果这是一个愚蠢的问题,也许我只是需要睡一觉,看看到底发生了什么!
我的方法:
制作一组与照片相关的可变相册(要获取的对象的最少数量)
从该集合中删除当前专辑
将更改后的集合保存为与其他相册的关系。
我的代码:
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)
}
找到问题了。
我的 NSManaged Object 子类与 NSMutableSet 类型而不是 NSSet 有一对多关系。不要这样做。
我不知道为什么这只适用于一个多对多关系,而当有两个关系时就停止工作了。它根本不应该起作用。