我刚刚开始使用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?)'
我不太确定我会用其他方式初始化它。
除此之外,我只是想知道是否有任何其他错误你可以指出,因为我无法测试我的代码。
任何建议都将不胜感激。
编辑:通过将我的代码更改为上面的代码,我现在可以正确加载我的应用程序,但是当我尝试在最后打印对象描述时仍然没有任何反应。
答案 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'