CoreData新增数据后模拟器不显示问题排查求助
嘿,我来帮你一步步排查可能的问题点,咱们慢慢捋:
先确认数据变更后有没有刷新UI
你之前用UserDefaults配合plist的时候,可能数据更新后UI能自动同步,但CoreData可不是这样哦。如果是手动查询数据来展示的,在新增数据成功后,一定要重新执行查询逻辑,然后调用tableView.reloadData()(如果用表视图展示)或者对应的UI刷新方法。要是想更省心,推荐用CoreData自带的NSFetchedResultsController,它能自动监听数据的增删改,自动帮你更新UI,不用手动刷。检查CoreData的保存操作是否真的成功了
看你贴的AppDelegate代码是截断的,先确认下新增数据后有没有调用上下文的save()方法,还要处理保存的错误,比如:
let context = persistentContainer.viewContext // 假设你已经创建好实体对象并赋值 do { try context.save() print("数据保存成功啦") } catch let error as NSError { print("保存失败:\(error.localizedDescription)") }
要是保存没成功,数据库里其实根本没数据,你之前觉得“数据已存入DB”可能是误判,得先把这步坐实。
核对数据查询的逻辑是否正确
看看你在ViewController里获取数据展示的代码,是不是查询条件写错了?或者用了和新增数据不一样的上下文?比如新增数据用的是私有后台上下文,但查询用的是主上下文,却没做上下文的同步,那主上下文里就拿不到新数据。确认AppDelegate的CoreData栈配置没问题
你贴的AppDelegate里没看到完整的CoreData栈实现,比如persistentContainer的定义,这部分要是配置错了,读写的可能不是同一个数据库文件。标准的CoreData栈大概是这样的:
lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "你的数据模型文件名") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("CoreData初始化失败:\(error), \(error.userInfo)") } }) return container }() func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError fatalError("保存上下文失败:\(nserror), \(nserror.userInfo)") } } }
另外applicationWillTerminate方法里有没有调用saveContext()?或者你新增数据后有没有主动调用这个方法?
最后,要是能补充下面这些信息,我能更快帮你定位问题:
- ViewController里展示数据的完整代码(包括查询CoreData、更新UI的部分)
- 你新增数据的具体代码逻辑
- 你是怎么验证数据已经存入数据库的(比如用工具打开SQLite文件看到数据了?)
备注:内容来源于stack exchange,提问作者Nour

