Swift核心数据删除一对多关系中的条目

时间:2015-07-15 12:48:04

标签: ios swift core-data

我在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的更改。你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我发现,在一对多关系帐户 - > 用户中没有反向关系的用户,更改帐户中的列表后,列表中的每个用户都必须标记已更改(属性{{1} })。但它始终设置为updated == true

我向User添加了其他属性,每次更改列表后,我都必须更改此属性,如false。在这一改变之后一切正常。