2015-02-28 2 views
3

Я только начал использовать Realm, в основном, чтобы предварительно заполнить мое приложение данными. Поэтому я решил, что самый простой способ сделать это - импортировать существующий JSON-файл в мое приложение, но я столкнулся с несколькими проблемами.Импорт JSON в Realm.io

Файл я пытаюсь импортировать отформатирован так:

{ "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." }

, и я хотел бы получить его в 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) говоря, что:

Cannot invoke 'JSONObjectWithData' with an argument list of type '(NSData, options: Int, error: inout NSError?)'

, и я не совсем уверен, что иначе я бы его инициализировал.

Помимо этого, мне просто интересно узнать, есть ли другие ошибки, о которых вы могли бы указать, поскольку я не смог проверить свой код.

Любые предложения будут оценены.

EDIT: Изменив свой код на один выше, я теперь могу загрузить приложение без ошибок, но все же ничего не происходит, когда я пытаюсь напечатать описания объектов в конце.

ответ

0

Я думаю, вы хотите сделать NSError изменчивым.

var error: NSError? 
+0

Только что изменил мой код с помощью библиотеки SwiftyJSON, так что теперь исправлена ​​ошибка, теперь я могу загрузить приложение без проблем, но когда я пытаюсь напечатать их в конце, ничего не происходит. – joseph

+0

мы не знаем, что происходит внутри 'Stockdata.createInDefaultRealmWithObject (запаса)' - для всех, кого мы знаем, он может возвращать пустые данные. Вы действительно должны научиться садиться и отлаживать свой код, прежде чем спросить людей о том, как это сделать. – timzilla

+0

Это стандартная функция, а не одна, которую я создал. – joseph

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) 
} 
+0

есть преимущество/оптимизация при использовании общедоступного func add (_ objects: S, update: Bool = default) где S: Sequence, S.Element: RealmSwift.Object по сравнению с циклом и добавлением объекта? – titusmagnus

+0

Для произвольной «последовательности» он будет добавлять каждый элемент один за другим, но если 'Sequence' является' RealmCollection', часто возникают оптимизации. – jpsim

-1

сейчас в 0.82 версии, вы можете использовать Func createAllFromJson(), который преобразует строку JSON в области действия объекта

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

зависимость для Gradle:

+0

это java ...оператору предлагается быстрое решение – Pentarex