领域:结果显示为零(不保存或不写入)
Realm : Results showing up as nil (either not saving or not writing)
这是我的 Dog.Swift 文件:
import RealmSwift
class Dog : Object {
dynamic var name : String = ""
dynamic var age : Int8 = 0
}
这是我调用它的地方:
let realm = Realm()
var myDog = Dog()
myDog.name = "Fido"
myDog.age = 5
realm.write{
realm.add(myDog)
}
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
let realmPath = documentsPath.stringsByAppendingPaths(["Dogs.swift"])
let pathToFile = realmPath[0] as! String
let allDogs = Realm(path: pathToFile).objects(MetricR)
println(allDogs)
println(allDogs.count)
输出到控制台:
Results<MetricR> (
)
0
所以我的问题的第 1 部分:我添加了 documentsPath、realmPath 和 pathToFile 变量,因为早些时候,当我只是将 "Dogs.swift" 而不是 pathToFile 传递给查询时,我收到一个错误,说:
"Terminating app due to uncaught exception 'RLMException', reason: 'open() failed: Permission denied
Unable to open a realm at path 'Dogs.swift'. Please use a path where your app has read-write permissions.'",
之后我将文件的权限更改为 777,但什么也没做,所以我传入了 pathToFile 变量,这似乎解决了这个问题。我猜(我希望这里有人可以告诉我!),这与我遇到的问题有关 - 这导致了第二部分 - 为什么查询没有产生任何结果?是没有保存,还是查询不正确?
(免责声明:我为 Realm 工作)
我想我在那里看到了一些可能导致其中一些问题的事情。
1) 当您将该 Dog 对象添加到 Realm 时,您使用的是 Realm()
对象,该对象(默认情况下,除非您更改它)将指向一个名为 default.realm
在您的文档目录中。添加这些对象以及读取时,您需要指定 Dogs
Realm 文件的路径。
2) 没错。您需要指定要保存的 Realm 文件的绝对文件路径。如果您只指定文件名,则假设您指的是 iOS 设备的根目录,它不在应用程序的沙箱中。
您应该能够像您一样通过获取应用程序的文档文件路径来设置文件路径,然后调用 stringByAppendingPathComponent:
将文件名添加到末尾。
此外,调用文件 Dogs.realm
而不是 Dogs.swift
可能更好。它可能不会对实施产生影响,但会减少混淆。
3) 在查询 dogs 对象时,您在其中有一个名为 MetricR
的对象。那是故意的吗? (它应该只是 Dog
)。
如果您需要进一步说明,请告诉我!谢谢!
这是我的 Dog.Swift 文件:
import RealmSwift
class Dog : Object {
dynamic var name : String = ""
dynamic var age : Int8 = 0
}
这是我调用它的地方:
let realm = Realm()
var myDog = Dog()
myDog.name = "Fido"
myDog.age = 5
realm.write{
realm.add(myDog)
}
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString
let realmPath = documentsPath.stringsByAppendingPaths(["Dogs.swift"])
let pathToFile = realmPath[0] as! String
let allDogs = Realm(path: pathToFile).objects(MetricR)
println(allDogs)
println(allDogs.count)
输出到控制台:
Results<MetricR> (
)
0
所以我的问题的第 1 部分:我添加了 documentsPath、realmPath 和 pathToFile 变量,因为早些时候,当我只是将 "Dogs.swift" 而不是 pathToFile 传递给查询时,我收到一个错误,说:
"Terminating app due to uncaught exception 'RLMException', reason: 'open() failed: Permission denied
Unable to open a realm at path 'Dogs.swift'. Please use a path where your app has read-write permissions.'",
之后我将文件的权限更改为 777,但什么也没做,所以我传入了 pathToFile 变量,这似乎解决了这个问题。我猜(我希望这里有人可以告诉我!),这与我遇到的问题有关 - 这导致了第二部分 - 为什么查询没有产生任何结果?是没有保存,还是查询不正确?
(免责声明:我为 Realm 工作)
我想我在那里看到了一些可能导致其中一些问题的事情。
1) 当您将该 Dog 对象添加到 Realm 时,您使用的是 Realm()
对象,该对象(默认情况下,除非您更改它)将指向一个名为 default.realm
在您的文档目录中。添加这些对象以及读取时,您需要指定 Dogs
Realm 文件的路径。
2) 没错。您需要指定要保存的 Realm 文件的绝对文件路径。如果您只指定文件名,则假设您指的是 iOS 设备的根目录,它不在应用程序的沙箱中。
您应该能够像您一样通过获取应用程序的文档文件路径来设置文件路径,然后调用 stringByAppendingPathComponent:
将文件名添加到末尾。
此外,调用文件 Dogs.realm
而不是 Dogs.swift
可能更好。它可能不会对实施产生影响,但会减少混淆。
3) 在查询 dogs 对象时,您在其中有一个名为 MetricR
的对象。那是故意的吗? (它应该只是 Dog
)。
如果您需要进一步说明,请告诉我!谢谢!