Swift:保存到核心数据上下文时出错
Swift : Error when saving to core data context
我的应用程序包含两个由选项卡栏控制器管理的视图。
第一个视图包含一个从服务器下载数据并将其解析为对象的按钮。完成后,我基于这些对象创建核心数据实体。任何时候按下按钮,之前的实体都会被删除以避免添加相同的数据
第二个视图包含 table 视图,负责显示检索到的核心数据实体数据。
这是我保存数据的方法:
func saveData()
{
var context:NSManagedObjectContext = self.managedObjectContext!
var error: NSError?
let entityDescription =
NSEntityDescription.entityForName("Medicine",
inManagedObjectContext: managedObjectContext!)
for element in self.loadedArray {
var medicine = Medicine(entity: entityDescription!,
insertIntoManagedObjectContext: managedObjectContext)
medicine.name = element.name
medicine.desc = element.desc
var error: NSError?
context.save(&error)
println(medicine)
}
}
这就是我删除数据的方式
func deleteData() {
let fetchRequest = NSFetchRequest(entityName: "Medicine")
let fetchedEntities = self.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as! [Medicine]
for entity in fetchedEntities {
self.managedObjectContext!.deleteObject(entity)
}
self.managedObjectContext!.save(nil)
}
一旦下载数据的 loadedArray 准备就绪,我就保存数据
var loadedArray:[Drug] = [] {
didSet {
self.saveData()
}
}
行为是不确定的,但错误通常发生在我保存数据,然后转到 table 查看然后返回 delete/save 新数据时。这是崩溃发生的时间,这是错误:
我知道这个错误相对难以重现,所以我认为最好的方法是提供一个 link 到 project
https://github.com/thedc89/MedApp(查看最新提交)
提前致谢
编辑:
这是第二个视图中的抓取结果控制器:
lazy var fetchedResultsController: NSFetchedResultsController = {
let medicinesFetchRequest = NSFetchRequest(entityName: "Medicine")
let primarySortDescriptor = NSSortDescriptor(key: "name.order", ascending: true)
medicinesFetchRequest.sortDescriptors = [primarySortDescriptor]
let frc = NSFetchedResultsController(
fetchRequest: medicinesFetchRequest,
managedObjectContext: self.managedObjectContext!,
sectionNameKeyPath: "name",
cacheName: nil)
frc.delegate = self
return frc
}()
此外,由于某种原因,github 项目中似乎缺少数据模型,这真的很奇怪。但是,如果它真的丢失了,我认为它不会保存任何数据,但这是我第一次触摸按钮时发生的
下载项目后,xcdatamodel
似乎丢失了,尽管它包含在 Xcode 项目中。 SO 上的其他答案似乎证实了相同错误的类似问题:here and here。
另外还有一个名为 order
的 属性 足够通用,可以在内部使用。尝试将其更改为 itemSortOrder
或更具描述性的内容以避免冲突。
我的应用程序包含两个由选项卡栏控制器管理的视图。
第一个视图包含一个从服务器下载数据并将其解析为对象的按钮。完成后,我基于这些对象创建核心数据实体。任何时候按下按钮,之前的实体都会被删除以避免添加相同的数据
第二个视图包含 table 视图,负责显示检索到的核心数据实体数据。
这是我保存数据的方法:
func saveData()
{
var context:NSManagedObjectContext = self.managedObjectContext!
var error: NSError?
let entityDescription =
NSEntityDescription.entityForName("Medicine",
inManagedObjectContext: managedObjectContext!)
for element in self.loadedArray {
var medicine = Medicine(entity: entityDescription!,
insertIntoManagedObjectContext: managedObjectContext)
medicine.name = element.name
medicine.desc = element.desc
var error: NSError?
context.save(&error)
println(medicine)
}
}
这就是我删除数据的方式
func deleteData() {
let fetchRequest = NSFetchRequest(entityName: "Medicine")
let fetchedEntities = self.managedObjectContext!.executeFetchRequest(fetchRequest, error: nil) as! [Medicine]
for entity in fetchedEntities {
self.managedObjectContext!.deleteObject(entity)
}
self.managedObjectContext!.save(nil)
}
一旦下载数据的 loadedArray 准备就绪,我就保存数据
var loadedArray:[Drug] = [] {
didSet {
self.saveData()
}
}
行为是不确定的,但错误通常发生在我保存数据,然后转到 table 查看然后返回 delete/save 新数据时。这是崩溃发生的时间,这是错误:
我知道这个错误相对难以重现,所以我认为最好的方法是提供一个 link 到 project https://github.com/thedc89/MedApp(查看最新提交)
提前致谢
编辑:
这是第二个视图中的抓取结果控制器:
lazy var fetchedResultsController: NSFetchedResultsController = {
let medicinesFetchRequest = NSFetchRequest(entityName: "Medicine")
let primarySortDescriptor = NSSortDescriptor(key: "name.order", ascending: true)
medicinesFetchRequest.sortDescriptors = [primarySortDescriptor]
let frc = NSFetchedResultsController(
fetchRequest: medicinesFetchRequest,
managedObjectContext: self.managedObjectContext!,
sectionNameKeyPath: "name",
cacheName: nil)
frc.delegate = self
return frc
}()
此外,由于某种原因,github 项目中似乎缺少数据模型,这真的很奇怪。但是,如果它真的丢失了,我认为它不会保存任何数据,但这是我第一次触摸按钮时发生的
下载项目后,xcdatamodel
似乎丢失了,尽管它包含在 Xcode 项目中。 SO 上的其他答案似乎证实了相同错误的类似问题:here and here。
另外还有一个名为 order
的 属性 足够通用,可以在内部使用。尝试将其更改为 itemSortOrder
或更具描述性的内容以避免冲突。