2017-01-03 80 views
0

我試圖讓我的腦袋圍繞swift &領域,所以我創建了一些類型的測試板程序。Realm/Swift:編譯錯誤:缺少參數'forPrimaryKey'的參數在調用

我的模型定義像這樣

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

EDIT

我還定義的類促進礦,基本上進行以下步驟中的本領域模型:

  • 產生一些隨機的數據;
  • 通過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())提到的錯誤消息。

回答

2

Swift編譯器告訴你它認爲你試圖調用Realm.object(ofType:forPrimaryKey:),它根據主鍵的值檢索單個對象。這聽起來像你真的想要撥打Realm.objects(_:)來檢索給定類型的所有對象。請注意,這將返回Results<T>,而不是List<T>

+0

確實如此,我想要檢索所有數據,而不管任何關鍵。有沒有完成這個選項,雖然模型是定義一個主鍵?我怎樣才能得到名單,而不是結果? – user4338

+0

'Realm.objects(_ :)'爲您提供給定類型的所有對象,無論它們是定義主鍵還是具有任何特定的主鍵值。 '結果'是什麼將返回。你爲什麼要'列表'? 'List 's只能被創建爲模型類的屬性。 – bdash

+0

問題是,爲什麼我的代碼無法編譯? – user4338