2016-01-15 7 views
0

Я знаком с Sqlite, но решил попробовать использовать мир для моего следующего проекта. У меня возникли проблемы с чтением данных из db и удалением объектов .Использование Realm with swift

Я использую путь области по умолчанию:

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:

'Удаляется только объект из области, к которой принадлежит.'

Я понимаю, что означает вышеуказанная причина, но не как ее решить?

А также как получить только этот объект из db после его добавления?

EDIT

Это мой 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 

     } 
    } 
+0

Я вижу, что вы используете Realm Objective-C интерфейс от Swift. В большинстве случаев рекомендуется использовать Realm Swift в приложениях Swift. Вы делаете это, потому что вам нужно запускать iOS 7 или получить доступ к вашим моделям Realm от Swift и Objective-C? – bdash

+0

Мне нужна поддержка iOS 7+, поэтому я подумал, что нужно будет использовать интерфейс Objective-C – Mat0

ответ

2

Что сообщение об ошибке пытается передать, что объект вы передаете -[RLMRealm deleteObject:] должны принадлежать к царству, что ты пытаясь удалить объект. В вашем случае вы передаете новый объект, который не принадлежит ни одному из Realm (такой объект упоминается как отдельный или незапертый объект в документации Realm). Вместо этого вы должны передать либо объект, который вы извлекли из 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") 
} 
+0

Спасибо, поэтому сначала нужно получить сохраненный объект и передать его deleteObject(). Кажется немного странным, вероятно, почему я этого не делал вначале. – Mat0

Смежные вопросы