2016-07-28 3 views
1

У меня есть Realm объекта:Как изменить значение атрибута Realm одноплодной

class TransactionDB: Object { 

    dynamic var transactionID : Int = -1 
    dynamic var registrationPlate : String = "" 
    dynamic var locationID : Int = 0 
    dynamic var time : String = "" 
    dynamic var subscription : String = "" 
    dynamic var startTime : NSDate = NSDate() 
    dynamic var endTime : NSDate = NSDate() 
    dynamic var status : Int = -2 
    dynamic var requestType : Int = -1 
    var extensions : List<ExtensionDB> = List<ExtensionDB>() 
    dynamic var price : Double = 0 
    dynamic var currency : String = "" 
    private dynamic var test : Int = 10 

    override static func primaryKey() -> String? { 
     return "transactionID" 
    } 

    class var sharedInstance : TransactionDB { 
     struct Singleton { 
      static let instance = TransactionDB() 
     } 
     return Singleton.instance 
    } 

    static func saveOrUpdate { 
     // ...... 
    } 

и одноплодная версия для него. Таким образом, у меня есть один объект над многими контроллерами, когда экраны меняются. Несколько дней назад я использовал некоторую более старую версию Objective-C Realm, но теперь я перешел на версию Swift 1.0.2, и я пытаюсь исправить все проблемы.

Так что теперь он пришел к части, что, когда я пытаюсь вызвать такие вещи, как:

TransactionDB.sharedInstance.time = "" 

я получаю исключение. Однако, после того, как я делаю следующее, это работает:

let realm = try! Realm() 
try! realm.write { 
    TransactionDB.sharedInstance.time = "" 
} 

Так я создаю одноэлементных неправильно или это именно так, как это должно быть сделано? Потому что для меня это немного раздражает, что мне всегда нужно использовать блок try, когда я хочу изменить значение некоторого атрибута.

ответ

1

Посмотрите на первую строку Realm docs for the write section.

Она гласит:

Все изменения объекта (добавление, изменение и удаление) должно быть сделано в рамках транзакции записи.

Так что да, это именно то, как вам нужно это делать.

+0

Я просто подумал, что он может работать без него, потому что я не хочу, чтобы он записывался в БД до тех пор, пока он не закончится. Я уже понял, что мне, вероятно, придется создать temp-класс, чтобы иметь такой объект. – schmru

+0

До конца? Логика, которая подготавливает значения, которые необходимо обновить? Просто сохраняйте всю свою логику вне/до блока транзакции и выполняйте только блок транзакций с использованием переменных всех готовых, как только вы будете готовы. Не смешивайте логику приложения с блоком транзакций. Сделайте как можно меньше внутри блока транзакций. – solidcell

+0

Это то, что я делал, у меня был общий экземпляр объекта, который никогда не записывался в БД, чтобы я мог менять вещи, и когда все было установлено, я создал новый объект с этими значениями и сохранил его. Но как-то, как только я установил общие атрибуты, я не смог бы их изменить без блока транзакций. – schmru

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