Nic*_*rmi 7 core-data swift xcode6
虽然Strings看起来很好,但是在将整数存储到Core Data中时遇到了一些麻烦.以下教程和阅读可用信息似乎没有帮助我没有Objective-C背景.(Swift看起来像一种直接的语言,就像我熟练使用PHP/OOPHP/JavaScript/VBScript/...这样我开始玩它,到目前为止我已经能够做到我想要的一切,差不多了)
我现在要做的是,接收JSON数据并将其存储到Core Data中
这是我的核心数据
Entity name: Category
其属性:
id Int16
title String
description String
我的Swift模型?文件:Category.swift
import CoreData
class Category: NSManagedObject {
    @NSManaged var id: Int //should I declare this as Int16?
    @NSManaged var title: String
    @NSManaged var description: String
}
我正在使用SwiftyJASON扩展程序?和NSURLSession协议?获取数据并解析它如下:
import UIKit
import CoreData
class ViewController: UIViewController {
    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
        func fetchData() {
            var url = NSURL.URLWithString("http://domain.com/index.php?r=appsync/read&id=category")
            var session = NSURLSession.sharedSession()
            session.dataTaskWithURL(url, completionHandler: {(data, response, error) in
                // parse data into json
                let json = JSONValue(data)
                let entityDescription = NSEntityDescription.entityForName("Category", inManagedObjectContext: self.managedObjectContext)
                let category = Category(entity: entityDescription, insertIntoManagedObjectContext: self.managedObjectContext)
                for item in json.array! {
                    category.id = item["id"].string!.toInt()! //goes KABOOM!
                    category.title = item["title"].string!
                    category.description = item["description"].string!
                    managedObjectContext?.save(nil)
                }
                dispatch_async(dispatch_get_main_queue()) {
                    // do something
                }
            }).resume()
        }
}
我们假设JASON数据是:
[{"id":"1","title":"cat1","description":"blabala one"},{"id":"2","title":"cat2","description":"blabala two"}]
在它说category.id = item["id"].string!.toInt()!xCode进入KABOOM的行,我在这里做错了什么?
备注/更多问题:
我尝试将Core Data中的id类型更改为Int32,然后在模型中将其声明为Int(而不是Int16或Int32),这减少了一些错误,但xCode仍然崩溃
可能我循环的方式并不是最好的方法,那么将数据数据一次存储到核心数据中的更好方法是什么?
我见过的大部分教程都没有实体(表格)的ID,我在这里遗漏了什么吗?
参考文献:
编辑>工作代码:
Category.swift模型文件,可以使用File> New> File> iOS> Core Data> NSManagedObject子类自动生成[swift,不需要桥接头但需要手动添加@objc行,如下所示]
import CoreData
@objc(Category) //Wouldn't work without this
class Category: NSManagedObject {
    @NSManaged var id: NSNumber //has to be NSNumber
    @NSManaged var title: String
    @NSManaged var mydescription: String //"description" is reserved so is "class"
}
ViewController.swift
import UIKit
import CoreData
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
    func fetchData() {
        var url = NSURL.URLWithString("http://domain.com/index.php?r=appsync/read&id=category")
        var session = NSURLSession.sharedSession()
        session.dataTaskWithURL(url, completionHandler: {(data, response, error) in
            let json = JSONValue(data)
            let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext //this line had to be moved here
            let entityDescription = NSEntityDescription.entityForName("Category", inManagedObjectContext: managedObjectContext)
            for item in json.array! {
                let category = Category(entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext) //this line has to be in inside for loop
                category.id = item["id"].string!.toInt()!
                category.title = item["title"].string!
                category.mydescription = item["description"].string!
                managedObjectContext?.save(nil)
            }
            dispatch_async(dispatch_get_main_queue()) {
                // do something
            }
        }).resume()
    }
}
获取数据代码示例:
func requestData() {
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext!
    var request = NSFetchRequest(entityName: "Category")
    request.returnsObjectsAsFaults = false
    var results:NSArray = context.executeFetchRequest(request, error: nil)
    //println(results)
    for category in results {
        var cat = category as Category
        println("\(cat.id),\(cat.title),\(cat.mydescription)")
    }
}
PS确保在更改模型后清理项目并从模拟器中删除应用程序
核心数据中的标量类型(整数,浮点数,布尔值)在当前的Swift beta(5)中被打破.使用NSNumber作为属性,并提交雷达.
object.intProperty = NSNumber(int:Int(item["id"] as String))
(在电话上打字,很抱歉,如果这是错的,我知道这是令人厌恶的代码 - 因此,提交雷达!)
或者,在您的特定情况下,查看JSON,使用String.无论如何,这些ID都以字符串形式出现.
| 归档时间: | 
 | 
| 查看次数: | 9281 次 | 
| 最近记录: |