NSManagedObject 保存在核心数据中但属性错误

Posted

技术标签:

【中文标题】NSManagedObject 保存在核心数据中但属性错误【英文标题】:NSManagedObject saved in core data but with the wrong attributes 【发布时间】:2015-02-13 11:57:22 【问题描述】:

我的 NSManagedObject 子类和核心数据有点问题。

所以,我创建了一个 NSManagedObject 的子类:

import Foundation
import CoreData
@objc(Alarm)

class Alarm: NSManagedObject 

    @NSManaged var name: String

    override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 
        super.init(entity: entity, insertIntoManagedObjectContext: context)

        name = "Unnamed"
    

我创建了一个 AlarmsManager 类来与核心数据建立链接

import UIKit
import CoreData

var alarmsMgr: AlarmsManager = AlarmsManager()

class AlarmsManager: NSObject 

let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext: NSManagedObjectContext
let entityDescription: NSEntityDescription

override init() 
    managedContext = appDelegate.managedObjectContext!
    entityDescription = NSEntityDescription.entityForName("Alarm", inManagedObjectContext: managedContext)!


func createAlarm() -> Alarm 
    var newAlarm: Alarm = Alarm(entity: entityDescription, insertIntoManagedObjectContext: managedContext)

    return newAlarm


func addAlarm(newAlarm: Alarm) -> Void 
    var error: NSError?
    println(newAlarm.name) // Display the good name
    if !managedContext.save(&error) 
        println("Error : \(error)")
    
    println("Done...")


另外,这是我加载闹钟的方式:

func loadAlarms() 
    let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let fetchRequest = NSFetchRequest(entityName:"Alarm")
    var error: NSError?
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as [NSManagedObject]?

    if let results = fetchedResults 
        alarmsArr = results
    
    else 
        println("Could not fetch \(error), \(error!.userInfo)")
    

所以:

1) 我使用 createAlarm

创建了一个新警报

2) 我使用类似 newAlarm.name = "New name"

之类的名称填写闹钟名称

3) 我尝试使用 AlarmManager 中的 addAlarm 将此对象保存在我的核心数据中

问题是:它确实将对象保存在核心数据中,但是当我尝试显示我的警报时,名称仍然是“未命名”

提前感谢您的帮助

【问题讨论】:

如果本地数据库中的属性正确,您可以检查您的模拟器(使用 sqlite 查看器)吗?并尝试获取警报数量 - 警报计数是否正确? 您好,如果属性正确,最好查看数据库,我搜索了如何执行此操作,发现我必须转到 ~/Library/Application Support/iPhone Simulator/7.1/申请但我找不到我的申请 转到 ~/Library/Developer/CoreSimulator/Devices/... 您使用的是 ios 8 吗? 谢谢你的路径,我找到了好文件并用sqlitebrowser打开它。有很多对象,当我刚刚添加警报时名称很好,但是当我停止应用程序时,打开它并添加另一个警报,名称更改为“未命名”。 (编辑:是的,我使用 iOS8) 【参考方案1】:

我在显示AlarmsListView的函数中添加了NSManagedObjectContext回滚函数,我的问题就解决了。

【讨论】:

以上是关于NSManagedObject 保存在核心数据中但属性错误的主要内容,如果未能解决你的问题,请参考以下文章

将更改 NSManagedObject 保存到核心数据失败

核心数据:NSManagedObject 何时插入上下文并保存?

核心数据,NSManagedObject 在应用版本之间发生变化

将 NSManagedObject 更新为核心数据

ios核心数据:如何更改NSManagedObject而不将其保存到上下文中

核心数据 NSManagedObject 更改