【问题标题】:how can I print core data right number?如何打印核心数据正确编号?
【发布时间】:2018-05-30 08:11:40
【问题描述】:

我设置了一个数组来保存来自 Core Data 的数据。

  var users:[Users] = []

当我想从 tableView 中删除我的一个数据时,我设置了这个函数,如下所示:

func deleteData(username:IndexPath){
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext

        context.delete(users[username.row])
        print("test1")
        print(users[username.row])
        print(users)
        print(users.count)


        do {
            try context.save()
            print("test2")
            print(users[username.row])
            print(users)
            print(users.count)
        } catch  {
            print("Could'n save data")
        }
    }

我观察了这个操作,在这里发现了一些问题:

在context.save()下面,我输入了print(users),控制台出来的users数据是什么:

test2
<Users: 0x600000286770> (entity: Users; id: 0xd000000000e40000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p57> ; data: <fault>)
[<Users: 0x600000281ea0> (entity: Users; id: 0xd000000000c40000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p49> ; data: {
    username = test1;
}), <Users: 0x6000002823f0> (entity: Users; id: 0xd000000000c80000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p50> ; data: {
    username = test2;
}), <Users: 0x6000002823a0> (entity: Users; id: 0xd000000000cc0000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p51> ; data: {
    username = test3;
}), <Users: 0x600000282350> (entity: Users; id: 0xd000000000d00000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p52> ; data: {
    username = test4;
}), <Users: 0x600000282300> (entity: Users; id: 0xd000000000d40000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p53> ; data: {
    username = test5;
}), <Users: 0x600000286770> (entity: Users; id: 0xd000000000e40000 <x-coredata://2D4CEBDA-C1B2-4CEC-A734-B7C9579C12A5/Users/p57> ; data: <fault>)]
6

但我只有 5 个数据,而不是 6 个。这个问题有什么问题?

【问题讨论】:

  • 如果您担心数组中的最后一项显示为错误,则无需担心。见this answer。错误只是 CoreData 节省内存,只要您访问第六项的任何属性,正确的数据就会被静默填充。

标签: ios core-data


【解决方案1】:

从 Core Data 中删除一个项目不会自动从数据源数组中删除它。您必须明确删除它:

context.delete(users[username.row])
users.remove(at: username.row)

【讨论】:

  • 谢谢,但是为什么控制台不能打印 test 6 ,而是打印错误???如何在 context.save() 下打印测试 6
  • 我很想明白另一个问题是:的数据是什么意思?我可以解决这个代码吗?
  • 我想打印测试 6 而不是数据:
  • 您已从核心数据堆栈中删除了该记录。数据源数组中的引用仍然存在于您的代码中,但数据已消失。要使数据源数组和核心数据堆栈保持同步,您还必须按照答案中的建议删除数据源数组中的项目。
猜你喜欢
  • 1970-01-01
  • 2012-08-31
  • 2015-12-24
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
相关资源
最近更新 更多