Ios 核心数据-NSManagedObject返回零

Ios 核心数据-NSManagedObject返回零,ios,core-data,nsfetchrequest,swift2.2,Ios,Core Data,Nsfetchrequest,Swift2.2,我在Appdelegate类中编写了两个独立的函数fetchRecords和displayRecordsfetchRecords函数将从实体中提取所有记录,并且工作正常。displayRecords函数接受fetchRecords函数的返回值,并逐个打印所有记录 我有一个视图控制器,它调用这两个函数来执行所需的任务。我的问题是result.displayRecords中的count显示获取的记录中可用的记录总数。逐个打印记录时,该值为零 override func viewDidLoad() {

我在
Appdelegate
类中编写了两个独立的函数
fetchRecords
displayRecords
fetchRecords
函数将从实体中提取所有记录,并且工作正常。
displayRecords
函数接受
fetchRecords
函数的返回值,并逐个打印所有记录

我有一个视图控制器,它调用这两个函数来执行所需的任务。我的问题是
result.
displayRecords
中的count
显示获取的记录中可用的记录总数。逐个打印记录时,该值为零

override func viewDidLoad() {
super.viewDidLoad()
    let fetchedRecords = AppDelegate().fetchRecords(fromEntity: "Dashboard")
    AppDelegate().displayRecords(fromFetchedRecords: fetchedRecords)   
}
下面是在AppDelegate类中编写的
fetchRecords
displayRecords
函数

  func fetchRecords(fromEntity entity:String) -> Array<AnyObject> {
    var fetchedResult:Array<AnyObject> = []
    let fetchRequest = NSFetchRequest()
    let entityDescription = NSEntityDescription.entityForName(entity, inManagedObjectContext: self.managedObjectContext)!
    fetchRequest.entity = entityDescription
    do{
        fetchedResult = try self.managedObjectContext.executeFetchRequest(fetchRequest)              
    }catch{
        let fetchError = error as NSError?
        print(fetchError!)
    }
   return fetchedResult
}

func displayRecords(fromFetchedRecords result:Array<AnyObject>) {
    print("Total records:\(result.count)")
    if (result.count > 0) {
        for data in result {
        let dashboard = data as! NSManagedObject
        print("Value: \(dashboard.valueForKey("count"))")
        }
    }
}
func fetchRecords(fromtentity:String)->数组

我也将分享数据插入代码

func saveDashBoardData(dictionary: Dictionary<String, String>) {
    print(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask))

    //Create Manage Object
    let entityDescription: NSEntityDescription = NSEntityDescription.entityForName("Dashboard", inManagedObjectContext: self.managedObjectContext)!
    for data in dictionary {
        let dashboardObject = Dashboard(entity: entityDescription,insertIntoManagedObjectContext: self.managedObjectContext)
        dashboardObject.type  = data.0
        dashboardObject.count = data.1
        do {
            try self.managedObjectContext.save()
            print("Data saved succesfully")
        }
        catch {
            print(error)
        }
    }
}
func保存仪表板数据(字典:字典){
打印(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask))
//创建管理对象
让entityDescription:NSEntityDescription=NSEntityDescription.entityForName(“仪表板”,在managedObjectContext:self.managedObjectContext中)!
查找字典中的数据{
让dashboardObject=Dashboard(实体:entityDescription,insertIntoManagedObjectContext:self.managedObjectContext)
dashboardObject.type=data.0
dashboardObject.count=数据。1
做{
请尝试self.managedObjectContext.save()
打印(“成功保存数据”)
}
抓住{
打印(错误)
}
}
}
试试这个

let dashboard = Dashboard as! NSManagedObject

print("Value: \(dashboard.count)")
我想这可能有用。因为您已将ManagedObject设置为数据。你最好把它当作一种仪表盘。这样,您就可以通过仪表板obj.count访问计数

希望您为实体创建了核心数据NSManagedSubclass


希望它能帮助..

从coredata模型创建Dashboard的NSManagedObject子类

func displayRecords(fromFetchedRecords result:Array<AnyObject>) {

    print("Total records:\(result.count)")
    if (result.count > 0) {
        for data in result {
        let dashboard = data as! Dashboard
        print("Value: \(dashboard.valueForKey("count"))")
        }
    }
}
func displayRecords(来自fetchedRecords结果:数组){
打印(“总记录:\(result.count)”)
如果(result.count>0){
查询结果中的数据{
让dashboard=数据为!dashboard
打印(“值:\(dashboard.valueForKey(“计数”)))
}
}
}
这里的关键更改是让dashboard=数据为!仪表板
Dashboard是托管对象子类,您需要使用核心数据模型帮助创建它

问题在于
AppDelegate()
总是创建一个与应用程序的“硬编码”委托实例不同的类的新实例

你必须写作

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let fetchedRecords = appDelegate.fetchRecords(fromEntity: "Dashboard")
appDelegate.displayRecords(fromFetchedRecords: fetchedRecords)
由于您已创建了
NSManagedObject
的自定义子类,请将其用作类型,而不是
NSManagedObject
或–更糟的是–未指定的
AnyObject
。它使许多事情变得更容易:

func fetchRecords(fromEntity entity:String) -> [Dashboard] {
  let fetchRequest = NSFetchRequest()
  let entityDescription = NSEntityDescription.entityForName(entity, inManagedObjectContext: self.managedObjectContext)!
  fetchRequest.entity = entityDescription
  do {
     return try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [Dashboard]              
  } catch let fetchError as NSError {
     print(fetchError!)
  }
  return [Dashboard]()
}

func displayRecords(fromFetchedRecords result:[Dashboard]) {
    print("Total records:\(result.count)")

    for dashboard in result { // the check for empty is not needed
       print("Value: \(dashboard.count)")
    }
}

你能给我看看你项目中的coredata模型吗@sindhu jaI已经分享了问题中的数据模型。请找到它我听不懂你想说什么@vadian@sindhuja:你能在let dashboard=data as上加一个断点吗!NSManagedObject并确认仪表板对象是否为零??我想如果它是零,它不会在那一点上崩溃。这意味着您的获取请求是正确的fecthing dashboard对象,但可能是dashboard对象在count:)中没有属性值,所以您可以做的是发布将dashboard对象插入到中的代码coredata@SandeepBhandari插入工作正常,我可以在DB中看到数据。无论如何,我将共享代码。是的,我已经为该实体创建了NSManagedSubclass。我试过你的建议,但也没用。谢谢@vadian。为
AppDelegate
创建实例解决了这个问题。对AppDelegate使用紧密耦合是不好的,会给您带来更多的麻烦。您最好遵循最近在中列出的设计,而不是模板中的设计。谢谢@Dovakin。我们使用了您的建议,并为
AppDelegate
创建了一个实例,解决了这个问题。