Realm / Swift:编译错误:缺少参数' forPrimaryKey'在电话中

时间:2017-01-03 20:46:48

标签: swift realm

我试图快速地抓住我的头脑。领域,所以我创建了一些测试平台程序。

我的模型定义如此

class RealmRecord: Object {

    // properties
    dynamic var id: Int = 0;
    dynamic var text: String = ""
    dynamic var var1: Double = 0.0
    dynamic var var2: Int = 0
    dynamic var var3: Double = 0.0
    dynamic var var4: Int = 0
    dynamic var cdate: Date = Date()
    dynamic var cusr: String = ""
    dynamic var mdate: Date = Date.distantPast
    dynamic var musr: String = ""
    dynamic var mcnt: Int = 0

    // methods
    convenience init(id: Int? = 0, text: String? = "", var1: Double? = 0.0,
                     var2: Int? = 0, var3: Double? = 0.0, var4: Int? = 0,
                     cusr: String? = "") {

        self.init()

        self.id = id!
        self.text = text!
        self.var1 = var1!
        self.var2 = var2!
        self.var3 = var3!
        self.var4 = var4!
        self.cdate = Date()
        self.cusr = cusr!
        self.mdate = Date.distantPast
        self.musr = ""
        self.mcnt = 0

    } // init

    override static func primaryKey() -> String? {
        return "id"
    } // primaryKey

} // RealmRecord

通过

完成持久化数据
try recRealm?.write {
    recRealm?.add(self.rec, update: true)
} // try

但是在通过

添加数据检索时
if let inrec = self.recRealm?.object(RealmRecord.self) {
    return inrec
} else {
    return List<RealmRecord>()
} // if/else

我在编译代码时收到错误消息,正在阅读

DataRealmRecord.swift:84:39: Missing argument for parameter 'forPrimaryKey' in call

查看Realm文档显示只检索所有持久化数据 - 显然没有定义主键 - 或者是主键指定的单个对象。

通过网络筛选几乎一样。

鉴于上述模型,我如何检索所有持久数据?

- Sil68

修改

我还定义了一个促进我的Realm模型的类,它基本上执行以下步骤:

  • 生成一些随机数据;
  • 通过Realm模型保留数据;
  • 再次读取数据;
  • 将生成的数据与读取数据进行比较。

代码

import Foundation
import RealmSwift

class DataRealmRecord {
    // properties
    private(set) var recDBPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    private(set) var recDBSubPath = "Persistency"
    private(set) var recDBFile = "data.realm"
    private(set) var recRealm: Realm?
    private(set) var recRealmCfg: Realm.Configuration?
    private(set) var rec = List<RealmRecord>()
    private(set) var startTime = 0.0
    private(set) var stopTime = 0.0
    private(set) var runTime = 0.0
    private(set) var outLog = ""
    private(set) var realmOk = false

    // methods
    init() {
        // assemble destination folder/database name
        do {
            try FileManager.default.createDirectory(atPath: recDBPath + "/" +
            recDBSubPath,
            withIntermediateDirectories: true,
            attributes: nil)
            recDBFile = recDBPath + "/" + recDBSubPath + "/" + recDBFile
            realmOk = true
        } catch let error as NSError {
            outLog += error.localizedDescription
            realmOk = false
        } // do/try/catch
        // configure realm database
        if (realmOk) {
            self.recRealmCfg = Realm.Configuration(fileURL: Foundation.URL(string: self.recDBFile))

            do {
                self.recRealm = try Realm(configuration: self.recRealmCfg!)
                realmOk = true
            } catch let error as NSError {
                outLog += error.localizedDescription
                realmOk = false
            } // do/try/catch
        } // if
    } // init

    // generate test data
    func generateData(noRecs: Int? = 1000, simDat: SimulateData?) {
        for i in 1...noRecs! {
            let realmRec = RealmRecord(id: i,
                                       text: String(format: "Record #%04d", i),
                                       var1: simDat?.datnorm[i - 1] ?? 1.1,
                                       var2: simDat?.datpois[i - 1] ?? 2,
                                       var3: simDat?.datunif[i - 1] ?? 3.3,
                                       var4: simDat?.datbern[i - 1] ?? 4,
                                       cusr: "me")
                                       self.rec.append(realmRec)
        } // for
    } // generateData

    // retrieve test data from persistent storage
    func loadData() -> List<RealmRecord> {
        if let inrec = self.recRealm?.object(RealmRecord.self) {
            return inrec
        } else {
            return List<RealmRecord>()
        } // if/else
    } // loadData

    // save test data to persistent storage
    func saveData() {
        do {
            try recRealm?.write {
                recRealm?.add(self.rec, update: true)
            } // try
        } catch let error as NSError {
            outLog += error.localizedDescription
        } // do/try/catch
    } // saveData

    // compare two data sets
    func compareData(rec1: List<RealmRecord>, rec2: List<RealmRecord>) -> Bool {
        var rc = false
        if rec1.count == rec2.count {
            rc = true
            for i in 0..<rec1.count {
                rc = rc && (rec1[i] == rec2[i])
            } // for
        } // if
        return rc
    } // compareData

    // run a full evaluation cycle
    // (1) generate test data;
    // (2) save test data to persistant storage;
    // (3) retrieve test data from persistant storage;
    // (4) compare generated data with retrieved data.
    func fullCycle(noRecs: Int? = 1000, simDat: SimulateData?, prnData: Bool? = false) {
        // start execution time measurement
        self.startTime = Double(CFAbsoluteTimeGetCurrent())
        // execute the full cycle
        self.generateData(noRecs: noRecs, simDat: simDat)           // (1)
        self.saveData()                                             // (2)
        let rec2 = self.loadData()                                  // (3)
        let cmpRec = compareData(rec1: self.rec, rec2: rec2)        // (4)
        // stop execution time measurement & calculate elapsed time
        self.stopTime = Double(CFAbsoluteTimeGetCurrent())
        self.runTime = self.stopTime - self.startTime
    } // fullCycle
} // DataRealmRecord

手头的问题是,由于上面提到的错误消息(在方法 loadData() 中),此代码无法编译。

1 个答案:

答案 0 :(得分:2)

Swift编译器告诉您它认为您正在尝试调用Realm.object(ofType:forPrimaryKey:)Realm.objects(_:)根据其主键的值检索单个对象。听起来你真的想调用{{3}}来检索给定类型的所有对象。请注意,这会返回Results<T>,而不是List<T>