[英]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.