虽然Strings看起来不错,但在将Integer存储到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,我在这里缺少什么吗?
参考文献:
编辑>工作代码:
可以使用File> New> File> iOS> Core Data> NSManagedObject子类自动生成的Category.swift模型文件[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还是以字符串形式输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句