Podczas gdy łańcuch wydaje się być w porządku, mam problem z przechowywanie liczb całkowitych w danych podstawowych. Podążanie za tutorialami i czytanie dostępnych informacji nie pomaga mi, kto nie ma tła w Objective-C. (Swift wydawał mi się językiem prostym, takim jak języki, w których płynnie posługuję się PHP/OOPHP/JavaScript/VBScript/... w ten sposób zacząłem grać z nim i do tej pory byłem w stanie zrobić wszystko, co chciałem, prawie)Przechowuj liczby całkowite w danych podstawowych za pomocą Swift i XCode
Co chcę zrobić to teraz, aby otrzymać dane JSON i przechowywać go w danych Core
Oto moje podstawowe dane
Entity name: Category
jego atrybutów:
id Int16
title String
description String
My Model 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
}
Używam rozszerzenia SwiftyJASON? i protokół NSURLSession? aby uzyskać dane i analizować je następująco:
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()
}
}
Załóżmy dane Jason:
[{"id":"1","title":"cat1","description":"blabala one"},{"id":"2","title":"cat2","description":"blabala two"}]
W wierszu, w którym jest napisane category.id = item["id"].string!.toInt()!
Xcode idzie Kaboom, co robię źle tutaj?
Uwagi/Inne pytania:
Próbuję zmienić typ id ciągu danych Core do Int32, a następnie deklarując je jako tylko Int w modelu (i nie Int16 lub Int32) co zmniejszyło masę błędów, ale Xcode ciągle wywala
Prawdopodobnie sposób mam pętli rzeczy nie jest najlepszym sposobem, aby to zrobić, co jest lepszym sposobem przechowywania tablicę danych do danych podstawowych w raz?
Większość tutoriali, które widziałem, nie ma identyfikatorów dla Entities (tabele), czy brakuje mi tutaj czegoś?
Referencje:
- SiftyJSON: https://github.com/lingoer/SwiftyJSON
- Rdzeń danych poradnik: http://rshankar.com/coredata-tutoiral-in-swift-using-nsfetchedresultcontroller/
EDIT> Praca kod:
Category.s wift plik model, który może być automatycznie generowane przy użyciu Plik> Nowy> Plik> iOS> Rdzeń danych> NSManagedObject podklasa [swift, nie ma potrzeby pomostowych nagłówek, ale trzeba ręcznie dodać linię @objc jak poniżej]
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()
}
}
Przykładowy kod pobierania danych:
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: Upewnij się, aby oczyścić swój projekt i usunąć aplikację z symulatora po zmianie modelu
Powinien być numer NSNumber? Lub może zostawić to jako identyfikator zmiennej? AS SWIFT wywnioskuje go z wartości, którą umieścisz? – CW0007007
Otrzymuję błąd "EXC_BAD_ACCESS", gdy robię to w tej samej linii, próbowałem zmienić 'Int' w modelu na' NSNumber', a także 'category.id = element [" id "]. String! .toInt() ! jako NSNumber! 'i inne kombinacje, ten sam wynik. I nie całkiem rozumiem, co masz na myśli przez _leave it as var id_ –
Nie jawnie zadeklarować typu? Nie zrobiłem wiele w szybkim tempie. Tak więc nie wiem, czy EntityModel będzie działał bez wyraźnego typu. Więc zmień na: @NSManaged var id – CW0007007