【问题标题】:Importing JSON to Realm.io将 JSON 导入 Realm.io
【发布时间】:2015-05-01 05:42:22
【问题描述】:

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

我尝试导入的文件格式如下:

{ “DDD”:“3D Systems Corporation”,“MMM”:“3M 公司”,“WBAI”: “500.com Limited”、“WUBA”:“58.com Inc.”、“AHC”:“A.H. Belo Corporation”、“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: &amp;error) 说:

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

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

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

任何建议将不胜感激。

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

【问题讨论】:

    标签: ios json swift nsdictionary realm


    【解决方案1】:

    我认为你想让 NSError 可变。

    var error: NSError?
    

    【讨论】:

    • 刚刚使用 SwiftyJSON 库更改了我的代码,以便现在处理错误,我现在可以毫无问题地加载应用程序,但是当我尝试在最后打印它们时没有任何反应。跨度>
    • 我们无法知道Stockdata.createInDefaultRealmWithObject(stocker) 内部发生了什么——我们只知道它可能返回空数据。在向 SO 提问之前,您真的应该学习如何坐下来调试您的代码。
    • 这是一个标准函数,不是我创建的。
    【解决方案2】:

    您的 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)
    }
    

    【讨论】:

    • 在使用 public func add(_ objects: S, update: Bool = default) where S : Sequence, S.Element : RealmSwift.Object 与循环时是否有好处/优化并添加一个对象?
    • 对于任意的Sequence, it'll add each element one by one, but if the Sequence` 是RealmCollection,经常有优化。
    猜你喜欢
    • 2015-12-29
    • 2013-06-26
    • 2017-12-12
    • 2017-01-16
    • 2017-04-05
    • 2016-10-22
    • 1970-01-01
    • 2018-08-11
    • 2017-07-12
    相关资源
    最近更新 更多