Основные данные в Swift

#core-data #nsarray #swift #nsmanagedobjectcontext #ios8

#основные данные #nsarray #swift #nsmanagedobjectcontext #ios8

Вопрос:

Пытаюсь работать с основными данными в Swift. Нашел этот пример:

http://www.sep.com/sep-blog/2014/06/23/a-c-developer-learns-swift-part-1-core-data/

Создан объект «Person» с двумя строковыми полями — lastname и firstname. Создан UITableViewController (MainTableViewController) для отображения записей на экране. Создан UIViewController (DetailViewController) для добавления новых записей. Создал свой собственный класс (AddrBook) для данных объектов.

Не работает отображение записей, содержащихся в сущности в основном классе — MainTableViewController.

Мой класс AddrBook.swift:

 import UIKit
import CoreData

@objc(AddrBook)
class AddrBook: NSManagedObject {

@NSManaged var lastname:String
@NSManaged var firstname:String
}
 

UIViewController для добавления новых записей. DetailViewController.swift:

 import UIKit
import CoreData

class DetailViewController: UIViewController {

@IBOutlet var lastNameField : UITextField = nil
@IBOutlet var firstNameField : UITextField = nil

init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func saveButtonPressed(sender : AnyObject) {

    let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    let context:NSManagedObjectContext = appDelegate.managedObjectContext
    let projectEntity = NSEntityDescription.entityForName("Person", inManagedObjectContext: context)
    var newPerson = AddrBook(entity: projectEntity, insertIntoManagedObjectContext: context)
    newPerson.lastname = lastNameField.text
    newPerson.firstname = firstNameField.text
    context.save(nil)
    self.dismissViewControllerAnimated(true, completion: nil)
}
}
 

Теоретически, в этом классе все идет хорошо. Запись должна быть добавлена.

Основной класс MainTableViewController.swift. Для отображения записей. Пытаюсь получить их через NSLog:

 import UIKit
import CoreData

class MainTableViewController: UITableViewController {

init(style: UITableViewStyle) {
    super.init(style: style)
}

init(coder aDecoder: NSCoder!) {
    super.init(coder: aDecoder)
}

override func viewDidLoad() {
    super.viewDidLoad()

    let request = NSFetchRequest(entityName: "Person")
    request.returnsObjectsAsFaults = false
    let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    let context:NSManagedObjectContext = appDelegate.managedObjectContext
    var results:NSArray = context.executeFetchRequest(request, error: nil)
    for currentPerson in results as AddrBook[] {
        NSLog("(currentPerson.lastname)")
        NSLog("(currentPerson.firstname)")
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
    return 1
}

override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
    return 0
}
}
 

Показывает, что в выражении есть ошибка

 for currentPerson in results as AddrBook[] {
 

Ошибка:

Не удается преобразовать тип выражения ‘AddrBook []’ в тип ‘AddrBook[]’

Что я делаю не так?


для LombaX:

 override func viewDidLoad() {
    super.viewDidLoad()

    let request = NSFetchRequest(entityName: "Person")
    request.returnsObjectsAsFaults = false
    let appDelegate:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    let context:NSManagedObjectContext = appDelegate.managedObjectContext
    var results : AddrBook[]? = context.executeFetchRequest(request, error: nil) as? AddrBook[]
    NSLog("(results)")
    if let array = results   // check for nil and unwrap
    {
        for currentPerson in array as AddrBook[] {
            NSLog("(currentPerson.lastname)")
            NSLog("(currentPerson.firstname)")
        }
    }

    // var results:NSArray = context.executeFetchRequest(request, error: nil)
    /*for currentPerson in results as AddrBook[] {
        NSLog("(currentPerson.lastname)")
        NSLog("(currentPerson.firstname)")
    }*/

}
 

Вывод NSLog — 2014-06-24 21:25:41.243 урок-12-swift[1651:136375] ноль

Переменные результаты равны нулю :- (

Ссылка на проект в Dropbox:https://www.dropbox.com/s/q42rw5fw470timi/lesson-12-swift.zip

Комментарии:

1. Во-первых: удалите for и поставьте точку останова после results = … . Посмотрите в окне переменных: правильно ли ваш массив заполнен объектами AddrBook? Кроме того, вы поместили в свой файл модели имя класса как «ProjectName. Добавить книгу»?

2. Пробовал. Скриншот результата: результаты ссылки =(_PFArray *)@ «1 объект» [0] (<недопустимый>)

3. Окно переменной теперь немного прослушивается… что, если вы напечатаете nn(результаты)?

Ответ №1:

Сначала убедитесь, что вы заполнили класс в модели данных: As ProjectName.AddrBook (для классов swift вы должны указать даже название проекта). (ПРИМЕЧАНИЕ: это необходимо, только если вы не использовали префикс @objc(AddrBook) перед классом, но я вижу, что вы его использовали, так что это не проблема).

или

как и в AddrBook, как на этом изображении в разделе класса, вверху справа

Модель данных

Кроме того, измените свое приведение следующим образом:

 // since executeFetchRequest can return nil, cast it as an optional array of [AddrBook]
// note: the first [AddrBook]? Can be omitted
var results : [AddrBook]? = context.executeFetchRequest(request, error: nil) as? [AddrBook]  

if let array = results   // check for nil and unwrap
{
    for currentPerson in array as [AddrBook] {
        // print
    }
}
 

Или, менее явный и без проверки на ноль

 var results = context.executeFetchRequest(request, error: nil)  

    for currentPerson in results as [AddrBook] {
        // print
    }
 

Комментарии:

1. Пожалуйста, добавьте детали к исходному вопросу, а не в качестве нового ответа. Однако, если результаты равны нулю, вы должны проверить наличие ошибки. Передайте переменную NSError как amp;error и проверьте возвращенную ошибку

2. Не могли бы вы посмотреть мой проект и помочь разобраться? Пожалуйста… Ссылка на Dropbox: dropbox.com/s/q42rw5fw470timi/lesson-12-swift.zip

3. Посмотрите на добавленное изображение, это была ваша проблема. Я быстро проверил, если это не сработает, я проверю еще раз, как только вернусь к ПК (1-2 часа)

4. Да! Это работа! Я сделал это: prntscr.com/3w2seg И это результат: prntscr.com/3w2tph Теперь я постараюсь продолжить работу с Core Data. Спасибо! Могу ли я задать пару вопросов позже? 🙂

Ответ №2:

    let arrayresult = context!.executeFetchRequest(request, error: amp;error)

    var arrayvalues=NSArray(array: arrayresult!)


    for obj in arrayvalues as [AddrBook]
    {

    }