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

Core data 使用Swift和XCode在核心数据中存储整数,core-data,swift,xcode6,Core Data,Swift,Xcode6,虽然字符串看起来不错,但我在将整数存储到核心数据时遇到了一些问题。对于没有Objective-C背景的我来说,下面的教程和阅读可用的信息似乎对我没有帮助。(Swift似乎是一种直截了当的语言,就像我能熟练使用PHP/OOPHP/JavaScript/VBScript/的语言一样……因此我开始使用它,到目前为止,我几乎可以做我想做的一切) 我现在想做的是,接收JSON数据并将其存储到核心数据中 Entity name: Category 这是我的核心数据 Entity name: Categor

虽然字符串看起来不错,但我在将整数存储到核心数据时遇到了一些问题。对于没有Objective-C背景的我来说,下面的教程和阅读可用的信息似乎对我没有帮助。(Swift似乎是一种直截了当的语言,就像我能熟练使用PHP/OOPHP/JavaScript/VBScript/的语言一样……因此我开始使用它,到目前为止,我几乎可以做我想做的一切)

我现在想做的是,接收JSON数据并将其存储到核心数据中

Entity name: Category
这是我的核心数据

Entity name: Category
其属性:

id Int16
title String
description String
我的雨燕模型?文件: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
}
我用的是迅捷杰森分机?和会话协议?要获取数据并对其进行解析,请执行以下操作:

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出错,我做错了什么

注意/更多问题:

  • 我尝试将核心数据中的id类型更改为Int32,然后将其声明为just Int 在模型中(而不是Int16或Int32),这减少了一些错误,但 xCode仍然崩溃

  • 可能我循环东西的方式不是最好的方式, 将数据数组存储到核心数据的最佳方式是什么 一次

  • 我看到的大多数教程都没有实体(表)的id,我是不是遗漏了什么

参考资料:

  • SiftyJSON:
  • 核心数据教程:
编辑>工作代码:

Category.swift模型文件,可使用文件>新建>文件>iOS>核心数据>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)")
    }
}
另外,在更改型号后,请确保清理您的项目并从模拟器中删除应用程序

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

if let unwrappedString = item["id"], unwrappedInt = Int(unwrappedString) {
    category.id = unwrappedInt
}
在当前的Swift测试版(5)中,核心数据中的标量类型(整数、浮点、布尔)被破坏。使用NSNumber作为属性,并归档雷达

object.intProperty = NSNumber(int:Int(item["id"] as String))
(在电话上输入,如果这是错误的,我很抱歉,我知道这是一个恶心的代码-因此,提交一个雷达!)


或者,在您的特定情况下,查看JSON,使用字符串。不管怎样,这些ID都是字符串

应该是你的号码?或者可以将其保留为var id?由于swift将从您输入的值中推断出它?当我在同一行执行此操作时,我得到
EXC\u BAD\u ACCESS
错误,我尝试将模型中的
Int
更改为
NSNumber
以及
category.id=item[“id”].string!。toInt()!作为一个数字和其他组合,结果相同。我不太明白你的意思,把它作为IDVAR不显式声明类型?我在斯威夫特做的不多。所以我不知道如果没有显式类型,EntityModel是否可以工作。因此,请改为:@NSManaged-idvar您的JSON数据的类型是什么?它似乎属于数组类型,即[String:String]]。。。对吗?用工作代码更新了我的问题,我相信xCode正在播放,因为我在没有清理我的项目的情况下更改了我的模型文件(我手动创建的),所以我得到了错误的访问错误@(objc)不是推荐的解决方案,请看你的答案是否正确,我必须在模型文件中使用NSNumber