将JSON导入Realm.io

时间:2015-02-28 15:16:24

标签: ios json swift nsdictionary realm

我刚刚开始使用Realm,主要是为了能够使用数据预先填充我的应用程序。所以我认为最简单的方法是将现有的JSON文件导入我的应用程序,但是我遇到了一些问题。

我要导入的文件格式如下:

  

{“DDD”:“3D Systems Corporation”,“MMM”:“3M Company”,“WBAI”:   “500.com Limited”,“WUBA”:“58.com Inc.”,“AHC”:“A.H。Belo   公司“,”ATEN“:”A10 Networks,Inc。“,”AAC“:”AAC Holdings,   Inc.“,”AIR“:”AAR Corp.“}

我希望将其纳入Dictionary<String,String>NSMutuableDictionary

我的代码如下所示:

class Stock: RLMObject {
    dynamic var name = ""
    dynamic var ticker = ""
}

class Table: RLMObject {
    dynamic var stocks = RLMArray(objectClassName: Stock.className())
}

import Realm

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


        let jsonFilePath:NSString = NSBundle.mainBundle().pathForResource("nyseDict", ofType: "json")!
        let jsonData:NSData = NSData.dataWithContentsOfMappedFile(jsonFilePath as String) as! NSData
        let error:NSError?
        let json = JSON(jsonData)

        let realm: RLMRealm = RLMRealm.defaultRealm()

        var table = Table()

        for var i = 0; i < json.count; ++i {

            let myStock = Stock()

            myStock.name = json[i][0].string!
            myStock.ticker = json[i][1].string!

            realm.beginWriteTransaction()
            realm.addObject(myStock)
            table.stocks.addObject(myStock)
            realm.commitWriteTransaction()

        }

        realm.transactionWithBlock() {
            realm.addObject(table)
        }

        for obj in Table.allObjects(){
        println(obj.description)
        }

        return true
    }

对于初学者,我在第15行收到错误:let collectionDicts:NSArray = NSJSONSerialization.JSONObjectWithData(jsonData, options: 0, error: &error)说:

  

无法使用类型的参数列表调用“JSONObjectWithData”   '(NSData,options:Int,error:inout NSError?)'

我不太确定我会用其他方式初始化它。

除此之外,我只是想知道是否有任何其他错误你可以指出,因为我无法测试我的代码。

任何建议都将不胜感激。

编辑:通过将我的代码更改为上面的代码,我现在可以正确加载我的应用程序,但是当我尝试在最后打印对象描述时仍然没有任何反应。

3 个答案:

答案 0 :(得分:0)

我认为你想让NSError变得可变。

var error: NSError?

答案 1 :(得分:0)

您的JSON是一个字典,但您将其作为一个数组(myStock.name = json[i][0].string!)访问它。这里是我刚刚编写的一些示例代码,用于验证如果您更改访问JSON数据的方式,一切都应该有效:

let json = [
    "DDD": "3D Systems Corporation",
    "MMM": "3M Company",
    "WBAI": "500.com Limited",
    "WUBA": "58.com Inc.",
    "AHC": "A.H. Belo Corporation",
    "ATEN": "A10 Networks, Inc.",
    "AAC": "AAC Holdings, Inc.",
    "AIR": "AAR Corp."
]

let realm = RLMRealm.defaultRealm()

let table = Table()

for (key, value) in json {

    let myStock = Stock()

    myStock.name = key
    myStock.ticker = value

    realm.beginWriteTransaction()
    realm.addObject(myStock)
    table.stocks.addObject(myStock)
    realm.commitWriteTransaction()
}

realm.transactionWithBlock() {
    realm.addObject(table)
}

for obj in Table.allObjects() {
    println(obj.description)
}

作为旁注,如果批量写入事务,您会看到性能提升:

let realm = RLMRealm.defaultRealm()
realm.beginWriteTransaction()

let table = Table()
realm.addObject(table)

for (key, value) in json {
    let myStock = Stock()
    myStock.name = key
    myStock.ticker = value
    table.stocks.addObject(myStock)
}

realm.commitWriteTransaction()

for obj in Table.allObjects() {
    println(obj.description)
}

答案 2 :(得分:-1)

现在在0.82版本中,您可以使用func createAllFromJson()将您的json字符串转换为realm对象

 Realm realm =  Realm.getInstance(context);
    realm.beginTransaction();
    realm.createAllFromJson(DMClass, jsonFormat);
    realm.commitTransaction();

gradle的依赖:

compile 'io.realm:realm-android:0.82.2'