2016-07-28 60 views
1

我有一个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-only版本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

我只是认为它可以在没有它的情况下工作,因为我不想将它写入数据库直到它完成。我已经想通了,我可能不得不创建临时类来获得这样的对象。 – schmru

+0

直到什么完成?准备要更新的值的逻辑?只要将所有逻辑保存在事务处理块之外/之前,并且只需使用准备好的所有变量执行事务处理块即可。不要将您的应用程序逻辑与事务块混合。在交易区块内尽可能少地操作。 – solidcell

+0

这就是我正在做的事情,我有一个从未写入数据库的共享对象实例,这样我就可以改变事情,并且在设置了所有事情时,我使用这些值创建了新对象并将其保存。但不知何故,一旦我设置了共享属性,我就无法在没有事务块的情况下更改它们。 – schmru