簡體   English   中英

快速使用Realm

[英]Using Realm with swift

我對Sqlite相當熟悉,但決定嘗試在我的下一個項目中使用領域。 我在從數據庫讀取數據以及刪除對象時遇到了麻煩。

我正在使用默認的領域路徑:

let realm = RLMRealm.defaultRealm()

當按下按鈕時,應該添加或刪除RLMObject(如果已經存在)。 這是該按鈕的IBAction:

@IBAction func addToFavor(sender: UIBarButtonItem) {

    // Create RealmTV (RLMObject)
    let tvShow = RealmTV(id: id, title: TitleLabel.text!, posterPath: posterUrl)

    if favoriteButton.image!.isEqual(UIImage(named: "Favor unfilled")) {

        realm.beginWriteTransaction()
        // Create or update tv-show in database 
        RealmTV.createOrUpdateInDefaultRealmWithValue(tvShow)

        try! realm.commitWriteTransaction()

        // Change button state
        favoriteButton.image = UIImage(named: "Favor filled")
    }
    else
    {

        realm.beginWriteTransaction()

        // Delete tv-show object from database
        realm.deleteObject(tvShow)          /*   RLMException here   */

        try! realm.commitWriteTransaction()

        // Change button state
        favoriteButton.image = UIImage(named: "Favor unfilled")
    }

}

當我嘗試將對象添加到數據庫后刪除該對象時。 我得到一個RLMExecption說:

“只能從其所屬領域刪除對象。”

我理解上述原因是什么意思,但不知道如何解決?

還有,添加后如何從數據庫中僅檢索該對象?

編輯

這是我的RealmTv類:

   import UIKit
   import Realm

   class RealmTV: RLMObject {
    dynamic var id = ""
    dynamic var title = ""
    dynamic var posterPath = ""

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

    override init() {
        super.init()
    }

    init(id: String, title: String, posterPath: String) {
        super.init()

        self.id = id
        self.title = title
        self.posterPath = posterPath

       }
     }

錯誤消息試圖傳達的是您傳遞給-[RLMRealm deleteObject:]必須屬於您要從中刪除對象的領域。 在您的情況下,您要傳遞不屬於任何Realm的新對象(此類對象在Realm的文檔中稱為獨立對象或非持久對象)。 相反,您必須傳遞從-[RLMRealm objectForPrimaryKey:]檢索的對象(使用-[RLMRealm objectForPrimaryKey:]+[RLMObject allObjectsInRealm:]等),或將其添加到-[RLMRealm addObject:] (使用-[RLMRealm addObject:] )。

重新編寫代碼以滿足這些要求將類似於:

if favoriteButton.image!.isEqual(UIImage(named: "Favor unfilled")) {
    realm.beginWriteTransaction()
    // Create or update tv-show in database 
    let tvShow = RealmTV(id: id, title: TitleLabel.text!, posterPath: posterUrl)
    RealmTV.createOrUpdateInDefaultRealmWithValue(tvShow)

    try! realm.commitWriteTransaction()

    // Change button state
    favoriteButton.image = UIImage(named: "Favor filled")
}
else {
    realm.beginWriteTransaction()

    // Delete tv-show object from database
    let tvShow = RealmTV.objectForPrimaryKey(id)
    realm.deleteObject(tvShow)

    try! realm.commitWriteTransaction()

    // Change button state
    favoriteButton.image = UIImage(named: "Favor unfilled")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM