使用Swift和XCode将整数存储在核心数据中

时间:2014-08-15 04:59:34

标签: core-data swift xcode6

虽然字符串看起来很好但我在将整数存储到核心数据时遇到了一些麻烦。按照教程和阅读可用信息,似乎没有帮助我没有Objective-C背景的人。 (Swift看起来像是一种直接的语言,就像我熟练使用PHP / OOPHP / JavaScript / VBScript / ......这样我就开始玩它了,到目前为止我已经能够完成我想做的一切了,差不多了)< / p>

我现在要做的是,接收JSON数据并将其存储到Core Data

这是我的核心数据

Entity name: Category

其属性:

id Int16
title String
description String

My Swift模特? file: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仍然崩溃

  • 我循环播放的方式可能不是最好的方法, 什么是将数据阵列存储到核心数据中的更好方法 一旦

  • 我见过的大多数教程都没有实体(表格),我在这里遗漏了什么吗?

参考文献:

编辑&gt;工作代码:

Category.swift模型文件,可以使用文件&gt;自动生成&gt;文件&gt; iOS&gt;核心数据&gt; 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)")
    }
}

P.S。确保在更改模型

后清理项目并从模拟器中删除应用程序

2 个答案:

答案 0 :(得分:6)

核心数据中的标量类型(整数,浮点数,布尔值)在当前的Swift beta(5)中被打破。使用NSNumber作为属性,并提交雷达。

object.intProperty = NSNumber(int:Int(item["id"] as String))

(在手机上输入,如果这是错的,那就很抱歉,我知道这是令人厌恶的代码 - 因此,请提供雷达!)

或者,在您的特定情况下,查看JSON,使用String。无论如何,这些ID都以字符串形式出现。

答案 1 :(得分:1)

更新了Swift 2

如果您的JSON数据确实属于[[String:String]]类型,则可以使用以下代码设置category.id

if let unwrappedString = item["id"], unwrappedInt = Int(unwrappedString) {
    category.id = unwrappedInt
}