【问题标题】:Using Realm with swift快速使用领域
【发布时间】:2016-01-15 11:45:16
【问题描述】:

我对 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")
    }

}

当我将对象添加到 db 后尝试删除它时。我得到一个 RLMExecption 说:

'只能从它所属的 Realm 中删除一个对象。'

我明白上述原因是什么意思,但不知道如何解决?

还有如何在添加后仅从 db 中检索此对象?

编辑

这是我的 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

       }
     }

【问题讨论】:

  • 我看到你正在使用 Swift 的 Realm Objective-C 接口。在大多数情况下,建议在 Swift 应用程序中使用 Realm Swift。您这样做是因为您需要在 iOS 7 上运行,还是需要同时从 Swift 和 Objective-C 访问您的 Realm 模型?
  • 我需要iOS 7+的支持所以我认为有必要使用Objective-C接口

标签: ios database swift swift2 realm


【解决方案1】:

错误消息试图传达的是您传递给-[RLMRealm deleteObject:] 的对象必须属于您尝试从中删除对象的领域。在您的情况下,您正在传递一个不属于任何领域的新对象(这样的对象在领域的文档中被称为独立或非持久对象)。相反,您必须传递从 Realm 检索到的对象(使用 -[RLMRealm objectForPrimaryKey:]+[RLMObject allObjectsInRealm:] 等),或添加到 Realm(使用 -[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")
}

【讨论】:

  • 谢谢,所以必须先检索存储的对象并将其传递给 deleteObject()。似乎有点奇怪,可能是我一开始没有这样做的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多