Swift中的核心数据

Ale*_*mov 3 core-data nsarray nsmanagedobjectcontext swift ios8

尝试在Swift中使用Core Data.找到这个例子:

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

创建了具有两个字符串字段的实体" Person " - lastnamefirstname.创建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
}
Run Code Online (Sandbox Code Playgroud)

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)
}
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,在这一课中一切顺利.必须添加条目.

主类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
}
}
Run Code Online (Sandbox Code Playgroud)

显示表达式中存在错误

for currentPerson in results as AddrBook[] {
Run Code Online (Sandbox Code Playgroud)

错误:

无法将表达式的类型'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)")
    }*/

}
Run Code Online (Sandbox Code Playgroud)

输出NSLog - 2014-06-24 21:25:41.243 lesson-12-swift [1651:136375] nil

可变结果为零:-(

链接到Dropbox中的项目: https ://www.dropbox.com/s/q42rw5fw470timi/lesson-12-swift.zip

Lom*_*baX 5

首先,检查您是否在数据模型中填写了类:As ProjectName.AddrBook(对于swift类,您甚至必须指定项目名称).(注意:只有在课前没有使用前缀@objc(AddrBook)时才需要这个,但是我看到你使用了它,所以这不是问题).

要么

作为AddrBook,如此图像中的Class部分,右上角

数据模型

而且,改变你的演员如下:

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,不那么明确,也没有检查零

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

    for currentPerson in results as [AddrBook] {
        // print
    }
Run Code Online (Sandbox Code Playgroud)