2016-04-29 2 views
1

Я написал две отдельные функции fetchRecords и displayRecords, написанные в Appdelegate Класс. fetchRecords функция будет извлекать все записи из объекта и работает нормально. Функция displayRecords принимает возвращаемое значение от fetchRecords и распечатывает все записи по одному.

У меня есть один контроллер вида, который вызывает эти две функции для выполнения желаемой задачи. Моя проблема result.count в displayRecords показывает общее количество записей, доступных в выбранных записях. При печати записей по одному значение равно нулю.Основные данные - NSManagedObject, возвращающий нуль

override func viewDidLoad() { 
super.viewDidLoad() 
    let fetchedRecords = AppDelegate().fetchRecords(fromEntity: "Dashboard") 
    AppDelegate().displayRecords(fromFetchedRecords: fetchedRecords) 
} 

А вот это fetchRecords и displayRecords функции, написанные в AppDelegate класса

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"))") 
     } 
    } 
} 

Добавление моей модели данных здесь enter image description here

поделюсь код для вставки данных также.

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) 
     } 
    } 
} 
+0

Можете ли вы показать мне свою CoreData модель в вашем проекте @sindhu JA –

+0

Я разделил модель данных в вопросе. Пожалуйста, найдите –

+0

Я не мог получить то, что вы пытаетесь сказать @vadian –

ответ

3

Проблема заключается в том, что 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)") 
    } 
} 
+0

Спасибо @vadian. Проблема с созданием экземпляра для 'AppDelegate'. –

+0

Использование жесткой связи с AppDelegate является плохим и вызовет у вас больше проблем, чем это стоит. Вы намного лучше следуете за дизайном, изложенным недавно в [Руководстве по программированию основных данных] (https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/index.html), а не в том, что в шаблоне. –

0

Попробуйте это ..

let dashboard = Dashboard as! NSManagedObject 

print("Value: \(dashboard.count)") 

Я думаю, что это могло бы работать. Потому что вы взяли ваш ManagedObject как данных. Лучше вы воспринимаете это как вид Личный кабинет. Чтобы вы могли получить доступ к счету от dashboardObj.count.

Надеюсь, что вы создали основные данные NSManagedSubclass для Entity.

Надеется, что это помогает ..

+0

Да, я уже создал NSManagedSubclass для этого объекта. Я попробовал ваше предложение, но оно также не работает. –

0

Создать NSManagedObject подкласс Dashboard от вашей CoreData модели.

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"))") 
     } 
    } 
} 

Ключ меняется здесь панель приборов = данные как! Панель приборов. Dashboard - это управляемый объектный подкласс, который вам нужно создать с помощью справочной системы с базовыми данными.

+0

Спасибо @Dovakin. Мы использовали ваше предложение, и создание экземпляра для 'AppDelegate' решило проблему. –

Смежные вопросы