CoreData 不将数据保存到数据库
Posted
技术标签:
【中文标题】CoreData 不将数据保存到数据库【英文标题】:CoreData doesn't save data to database 【发布时间】:2015-01-07 20:49:35 【问题描述】:我正在按照 Youtube 上的教程使用 Swift 编写 ios 应用程序。该应用程序将具有与待办事项列表应用程序相同的功能,但有另一种用途。但是,当我期望数据被保存(并在调试器中打印)时,什么也没有发生。我是不是做错了什么?
@IBAction func saveTapped(sender: AnyObject)
println("SaveTapped")
// Reference to our app delegate
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
// Reference moc
let contxt: NSManagedObjectContext = appDel.managedObjectContext!
let en = NSEntityDescription.entityForName("Tankningslista", inManagedObjectContext: contxt)
// Create instance of our data model and initialize
var nyTankning = Model(entity: en!, insertIntoManagedObjectContext: contxt)
// Map our properties
nyTankning.liter = (textFieldLiter.text as NSString).floatValue
nyTankning.kronor = (textFieldKronor.text as NSString).floatValue
nyTankning.literpris = (textFieldLiterpris.text as NSString).floatValue
//nyTankning.datum = datePickerDatum.date
// Save our context
contxt.save(nil)
println(nyTankning) //HERE I ESPECT THE DATA TO BE PRINTED IN THE DEBUG WINDOW
// navigate back to root vc
self.navigationController?.popToRootViewControllerAnimated(true)
【问题讨论】:
我建议你将错误变量传递给context.save
,然后检查它以确定是否保存成功
故意忽略save
的返回值并且在出现错误时不传入NSError
是在要求这种无声的失败。
【参考方案1】:
您需要先获取数据才能显示。现在你只保存它。保存数据后查看我在您的代码中添加的内容。
@IBAction func saveTapped(sender: AnyObject) println("SaveTapped")
// Reference to our app delegate
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
// Reference moc
let contxt: NSManagedObjectContext = appDel.managedObjectContext!
let en = NSEntityDescription.entityForName("Tankningslista",inIntoManagedObjectContext: contxt)
// Create instance of our data model and initialize
// Use your NSManagedModel to initialize not only the Model Keyword!
var nyTankning = Tankningslista(entity: en!, insertIntoManagedObjectContext: contxt)
// Map our properties
nyTankning.liter = (textFieldLiter.text as NSString).floatValue
nyTankning.kronor = (textFieldKronor.text as NSString).floatValue
nyTankning.literpris = (textFieldLiterpris.text as NSString).floatValue
//nyTankning.datum = datePickerDatum.date
// Save our context
if contxt.save(nil)
// Fetch the Data from Core Data first....
let fetchRequest = NSfetchRequest(entityName: "Tankningslista")
var error:NSError?
var result = contxt.executeFetchRequest(fetchRequest, error: &error) as [Tankningslista]
for res in result
// Now you can display the data
println(res.liter)
......
......
// End of the fetching
else
println(error)
//println(nyTankning) //HERE I ESPECT THE DATA TO BE PRINTED IN THE DEBUG WINDOW
// navigate back to root vc
self.navigationController?.popToRootViewControllerAnimated(true)
我希望解决方案能解决您的问题。
【讨论】:
“在 var 结果行上使用未声明的类型 'Tankningslista'”? 通常应该可以,因为我使用了您的托管对象“Tankningslista”-您应该检查该对象是否已保存。 - 我修改了我的代码现在看看.... 它被打印出来了,我可以在我的 UITableViewController 中检索最新保存的数据。每次我保存时,都会添加一个新行,但其中包含最新保存的数据。 是的,您的解决方案已解决。我会给你更多信息【参考方案2】:Puuh,还有很多需要改进的地方,我真的建议你在 Udemy/Bitfountain 或 Udacity 等平台上学习“真正的”iOS/swift 课程。首先,您需要在函数中的某处获取 ManagedObject(然后将结果存储在数组中)或使用 NSFetchedResultController(主要用于带有 TableViews 的 CoreData)然后我不确定您的 numberOfRowsInSection 函数中有什么,在这里还应该有正确的返回值。正如我所说,在这里解决这个问题真的太多了......
【讨论】:
这不是我们检查数据是否保存的方法吗?我可以在 UITABLEVIEWCONTROLLER 中做同样的事情,然后将其保存在数组中吗? 这有点复杂,您的 TableView 需要知道要绘制多少行,这取决于您的 CoreData 中的条目此外,您需要获取数组中某处的值,而您不能在“cellForRowAtIndexPath”函数中执行此操作。所以你需要一个额外的功能,或者你用 NSFetchedResultController 来做......但正如我所说,你真的应该花时间学习一门课程,这是绝对值得的,有些也是免费的...... .以上是关于CoreData 不将数据保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章