Nic*_*rmi 7 core-data swift xcode6
虽然Strings看起来很好,但是在将整数存储到Core Data中时遇到了一些麻烦.以下教程和阅读可用信息似乎没有帮助我没有Objective-C背景.(Swift看起来像一种直接的语言,就像我熟练使用PHP/OOPHP/JavaScript/VBScript/...这样我开始玩它,到目前为止我已经能够做到我想要的一切,差不多了)
我现在要做的是,接收JSON数据并将其存储到Core Data中
这是我的核心数据
Entity name: Category
Run Code Online (Sandbox Code Playgroud)
其属性:
id Int16
title String
description String
Run Code Online (Sandbox Code Playgroud)
我的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
}
Run Code Online (Sandbox Code Playgroud)
我正在使用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()
}
}
Run Code Online (Sandbox Code Playgroud)
我们假设JASON数据是:
[{"id":"1","title":"cat1","description":"blabala one"},{"id":"2","title":"cat2","description":"blabala two"}]
Run Code Online (Sandbox Code Playgroud)
在它说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"
}
Run Code Online (Sandbox Code Playgroud)
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()
}
}
Run Code Online (Sandbox Code Playgroud)
获取数据代码示例:
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)")
}
}
Run Code Online (Sandbox Code Playgroud)
PS确保在更改模型后清理项目并从模拟器中删除应用程序
核心数据中的标量类型(整数,浮点数,布尔值)在当前的Swift beta(5)中被打破.使用NSNumber作为属性,并提交雷达.
object.intProperty = NSNumber(int:Int(item["id"] as String))
Run Code Online (Sandbox Code Playgroud)
(在电话上打字,很抱歉,如果这是错的,我知道这是令人厌恶的代码 - 因此,提交雷达!)
或者,在您的特定情况下,查看JSON,使用String.无论如何,这些ID都以字符串形式出现.