使用 Realm 保存数据数组或自定义类

dkc*_*s11 3 realm nsdata ios swift

我有一个包含大量信息的自定义类。这是一个位置跟踪应用程序,所以我稍后需要位置(基本上只有 x、y、z,但为了方便我使用 CLLocations)。现在我有一个自定义类,其中包含有关每个跟踪的所有信息,例如记录/保存文件)。我使用 Realm 来保存它,Realm 可以很好地处理我的双打和字符串,但是我在处理数据数组时遇到了麻烦。

我能找到的最方便的解决方案是将数据转换为 NSData。在谷歌的帮助下,我找到了两种编码和解码的方法。但我没有这方面的经验,所以我不确定它是否有效。而且我不认为它有效。

我可以很好地加载双打和字符串,但我的 NSData 似乎是空的。我试图将我的类编码为 NSData 并将其保存在 Realm 中,但这似乎不起作用,因此我的理论是编码/解码功能无法正常工作。

TL;DR 我有我的自定义类(数据记录),我想用 Realm 保存。我如何解决这个问题?

我的课:

class DataRecord {
    var startLocation : CLLocation = CLLocation.init()
    var endLocation : CLLocation = CLLocation.init()
    var duration : Double = 0.0
    var distance: Double = 0.0

   var avgSpeed : Double = 0.0
   var topSpeed : Double = 0.0

   var locations : [CLLocation] = []
   var altitudes : [Double] = []
   var angles : [Double] = []
   var speeds : [Double] = []
}
Run Code Online (Sandbox Code Playgroud)

我的 NSData 编码/解码器

func encode<T>(value: T) -> NSData {
    var val = value
    return withUnsafePointer(&val) { p in
        NSData(bytes: p, length: sizeofValue(value))
    }
}

func decode<T>(data: NSData) -> T {
    let pointer = UnsafeMutablePointer<T>.alloc(sizeof(T.Type))
    data.getBytes(pointer, length: sizeof(T))

    return pointer.move()
}
Run Code Online (Sandbox Code Playgroud)

Realm 类与我的记录几乎相同,因此仅对记录进行编码并将其保存到 Realm 会更容易。但这里是:

class Record: Object {
    dynamic var name = ""
    dynamic var locations = NSData()
    dynamic var altitudes = NSData()
    dynamic var angles = NSData()
    dynamic var speeds = NSData()
    dynamic var distance = 0.0
    dynamic var duration = 0.0
    dynamic var topSpeed = 0.0
    dynamic var avgSpeed = 0.0
    dynamic var topAngle = 0.0
    dynamic var avgAngle = 0.0
}
Run Code Online (Sandbox Code Playgroud)

TiM*_*TiM 6

Realm 仅支持基本数据类型,因此您需要将数据“转换”为CLLocationRealm 可以存储的内容是正确的。

在这种情况下,与其尝试序列化CLLocationto NSDataObject不如CLLocation创建另一个拥有与 相同数据的Realm子类,并且可以动态创建该类型的对象会容易得多。

此外,虽然它有些限制,但 Realm 只能Object在其List属性中存储其他 Realm 。因此,在这种情况下,也有必要将其他值(例如高度等)也包含在它们自己的 RealmObject子类中。

class Location: Object {
    dynamic var latitude = 0.0
    dynamic var longitude = 0.0
    var clLocation: CLLocation {
        return CLLocation(latitude: self.latitude, longitude: self.longitude)
    }

    init(clLocation: CLLocation) {
        self.latitude = clLocation.latitude
        self.longitude = clLocation.longitude
    }
}

class Altitude: Object {
    dynamic var altitudeValue = 0.0
}

class Angle: Object {
    dynamic var angleValue = 0.0
}

class Speed: Object {
    dynamic var speedValue = 0.0
}

class Record: Object {
    dynamic var name = ""

    dynamic var startLocation: Location?
    dynamic var endLocation: Location?

    dynamic var distance = 0.0
    dynamic var duration = 0.0
    dynamic var topSpeed = 0.0
    dynamic var avgSpeed = 0.0
    dynamic var topAngle = 0.0
    dynamic var avgAngle = 0.0

    let locations = List<Location>()
    let altitudes = List<Altitude>()
    let angles = List<Angle>()
    let speed = List<Speed>()
}
Run Code Online (Sandbox Code Playgroud)