加载主 TableViewController 后值从 CoRe 数据中消失
Value disappears from CoRe DaTa after loading main TableViewController
当我从 CoreData 加载主 TableView 项目列表时,它通过以下方式完美显示:
let fetchRequest:NSFetchRequest<Identity> = Identity.fetchRequest()
do
{
identities = try DatabaseController.getContext().fetch(fetchRequest)
print("number of results: \(identities.count)")
for identity in identities as [Identity]
{
print("\(identity.pName!) is \(identity.accuracy)% Robesper. Updeted \(identity.lastModified!).")
}
}
catch
{
print("Error fetchRequest in ViewWillApper: \(error)")
}
删除也很有效,所以我创建了一个新的 NavigationController 和一个用于添加新对象的视图。
为了检查列表并找出问题所在(显然),我输出了 list.count 。因为当我用列表加载主 TableView 时,新的 ITEM 基本上不会出现。但是,当我重新启动 SIMULATOR 时,它会显示所有项目。
所以
1. 创建新对象。
- 已将此插入到 CoreData。
- 已检查。它在那里!你可以看到...
> number of results: 3 Hello World is 99% Robesper. Updeted 2017-07-08
> 17:50:30 +0000. Sex is 99% Robesper. Updeted 2017-07-27 17:56:12
> +0000. test is 99% Robesper. Updeted 2017-07-27 18:03:28 +0000.
现在 -> 转到 TableView -> 我检查了 viewDidLoad 和 viewWillAppear 的列表。
为“0”。很好,因为它不乱,我们现在可以从 TableViewController 的 CoreData 列表中检查。
number of results viewDidLoad: 0
viewWillAppear: 0
number of results: 2
Sex is 99% Robesper. Updeted 2017-07-27 17:56:12 +0000.
Hello World is 99% Robesper. Updeted 2017-07-08 17:50:30 +0000.
after fetch: 2
已获取。但是现在缺少 1 个新值!?什么???
- 重新启动模拟器。它现在向我显示 3 个项目。但是当我重复添加项目时,它又发生了。
可能是因为我们从 AppDelegate 保存的程序终止了?
func applicationWillTerminate(_ application: UIApplication)
{
DatabaseController.saveContext()
}
我将保存的 .saveContext() 粘贴到 ViewWillAppear 上,但没有用。什么?我做错了什么伙计们?请!救救我 :D
您应该在完成插入项目后保存上下文。
视图不会自行更新。您需要在 table 视图上重新获取并调用 reloadData。或者使用 NSFetchedResultsController 将 table 连接到 CoreData 查询:https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller
从核心数据中获取结果后,当视图出现在主队列中时,您应该重新加载table。
DispatchQueue.main.async {
tableView.reloadData()
}
获取process/setting个变量...然后...
我想我应该清理用于存储数据的临时变量。所以我用 DatabaseController.getContext().delete(identity)
来保持干净。
不过,在SWIFT里就没必要那么做了,因为这个MANAGERs可以帮你搞定。您只需要 - SAVE'n'GO 重新加载 table/Data 列表
只是评论这解决了所有问题)
//DatabaseController.getContext().delete(identity)
DatabaseController.saveContext()
当我从 CoreData 加载主 TableView 项目列表时,它通过以下方式完美显示:
let fetchRequest:NSFetchRequest<Identity> = Identity.fetchRequest()
do
{
identities = try DatabaseController.getContext().fetch(fetchRequest)
print("number of results: \(identities.count)")
for identity in identities as [Identity]
{
print("\(identity.pName!) is \(identity.accuracy)% Robesper. Updeted \(identity.lastModified!).")
}
}
catch
{
print("Error fetchRequest in ViewWillApper: \(error)")
}
删除也很有效,所以我创建了一个新的 NavigationController 和一个用于添加新对象的视图。
为了检查列表并找出问题所在(显然),我输出了 list.count 。因为当我用列表加载主 TableView 时,新的 ITEM 基本上不会出现。但是,当我重新启动 SIMULATOR 时,它会显示所有项目。
所以 1. 创建新对象。
- 已将此插入到 CoreData。
- 已检查。它在那里!你可以看到...
> number of results: 3 Hello World is 99% Robesper. Updeted 2017-07-08 > 17:50:30 +0000. Sex is 99% Robesper. Updeted 2017-07-27 17:56:12 > +0000. test is 99% Robesper. Updeted 2017-07-27 18:03:28 +0000.
现在 -> 转到 TableView -> 我检查了 viewDidLoad 和 viewWillAppear 的列表。
为“0”。很好,因为它不乱,我们现在可以从 TableViewController 的 CoreData 列表中检查。
number of results viewDidLoad: 0 viewWillAppear: 0 number of results: 2 Sex is 99% Robesper. Updeted 2017-07-27 17:56:12 +0000. Hello World is 99% Robesper. Updeted 2017-07-08 17:50:30 +0000. after fetch: 2
已获取。但是现在缺少 1 个新值!?什么???
- 重新启动模拟器。它现在向我显示 3 个项目。但是当我重复添加项目时,它又发生了。
可能是因为我们从 AppDelegate 保存的程序终止了?
func applicationWillTerminate(_ application: UIApplication)
{
DatabaseController.saveContext()
}
我将保存的 .saveContext() 粘贴到 ViewWillAppear 上,但没有用。什么?我做错了什么伙计们?请!救救我 :D
您应该在完成插入项目后保存上下文。
视图不会自行更新。您需要在 table 视图上重新获取并调用 reloadData。或者使用 NSFetchedResultsController 将 table 连接到 CoreData 查询:https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller
从核心数据中获取结果后,当视图出现在主队列中时,您应该重新加载table。
DispatchQueue.main.async {
tableView.reloadData()
}
获取process/setting个变量...然后...
我想我应该清理用于存储数据的临时变量。所以我用 DatabaseController.getContext().delete(identity)
来保持干净。
不过,在SWIFT里就没必要那么做了,因为这个MANAGERs可以帮你搞定。您只需要 - SAVE'n'GO 重新加载 table/Data 列表
只是评论这解决了所有问题)
//DatabaseController.getContext().delete(identity)
DatabaseController.saveContext()