我在iOS 8.4项目中使用Xcode 6.4和Swift 我有一个有一对多关系的模型
class Account: NSManagedObject {
@NSManaged var userId: Int
@NSManaged var accessToken: String?
@NSManaged var userName: String
@NSManaged var sex: String
@NSManaged var email: String
@NSManaged var avatarUrl: String?
@NSManaged var friends: NSSet
}
class User: NSManagedObject {
@NSManaged var id: Int
@NSManaged var userName: String
@NSManaged var sex: String
@NSManaged var email: String
@NSManaged var avatarUrl: String
}
当我试图删除所有朋友时,它不起作用:
extension Account {
func replaceFriends(friends:[User]) {
var friendsList = self.mutableSetValueForKey("friends")
friendsList.removeAllObjects()
friendsList.addObjectsFromArray(friends)
}
func getFriends() -> [User] {
return self.mutableSetValueForKey("friends").allObjects as! [User]
}
}
class AccountDao: BaseDao {
private class func findAccount() -> Account? {
if let result = moc.executeFetchRequest(NSFetchRequest(entityName: "Account"), error: nil) as? [Account] {
if (!result.isEmpty) {
return result[0]
}
}
return nil
}
class func getAccount() -> Account {
return findAccount() ??
NSEntityDescription.insertNewObjectForEntityForName("Account", inManagedObjectContext: moc) as! Account;
}
}
在保存期间,我设置了空数组:
class func saveObjectContext() -> Bool {
var error: NSError?
var account = AccountDao.getAccount()
account.replaceFriends([User]())
if !moc.save(&error) {
self.log.error("Error during saving context, \(error)")
return false
} else {
println("Count in log \(AccountDao.getAccount().getFriends().count)")
self.log.info("Info save context \(error)")
return true
}
}
在日志中它返回0:
Count in log 0
但是在ControllerView中我仍然得到AccountDao.getAccount().getFriends().count == 1
。方法replaceFriends
仅在我获取和保存数据时第一次起作用。它会保存userName
等简单属性的更改,但不会保存friends
的更改。你有什么想法吗?
答案 0 :(得分:1)
我发现,在一对多关系帐户 - > 用户中没有反向关系的用户,更改帐户中的列表后,列表中的每个用户都必须标记已更改(属性{{1} })。但它始终设置为updated == true
。
我向User添加了其他属性,每次更改列表后,我都必须更改此属性,如false
。在这一改变之后一切正常。