【问题标题】:realm commit write error - Can't commit a non-existing write transaction领域提交写入错误 - 无法提交不存在的写入事务
【发布时间】:2017-01-11 10:22:56
【问题描述】:

我正在尝试向领域数据库表中添加一条记录。

我有一个连接类,它代表我在数据库中需要的一个表,并创建了动态变量来代表列:

import Foundation
import RealmSwift
import Realm

open class ConnectionState: Object {

    open dynamic var _id : String = NSUUID().uuidString
    open dynamic var a : String = ""
    open dynamic var b : String = ""
    open dynamic var c : Int = 0

    open override class func primaryKey() -> String? {
        return "_id"
    }

    required public init() {
        super.init()
    }

    required public init(realm: RLMRealm, schema: RLMObjectSchema) {
        super.init(realm: realm, schema: schema)
    }

    required public init(value: Any, schema: RLMSchema) {
        fatalError("init(value:schema:) has not been implemented")
    }
}

然后在我的代码中,我尝试像这样编写并提交写入事务:

let ConnectionState = ConnectionState()
ConnectionState.a = "a"
ConnectionState.b = "b"
ConnectionState.c = 1
try! self.realm.write {
     self.realm.add(ConnectionState)
}

try! self.realm.commitWrite()

运行此代码时,我收到错误消息:

Can't commit a non-existing write transaction

我错过了什么?我的 ConnectionState 类中是否需要初始化? 在添加 commitWrite 之前,我试图用领域浏览器查看数据库。我在 xCode 中找到了我的设备并选择下载容器,但它是空的。然后我想我需要添加commitWrite

【问题讨论】:

    标签: swift database swift3 realm realm-mobile-platform


    【解决方案1】:

    在您的示例中,您调用了commitWrite 而没有调用beginWrite。你不能提交一个写事务,因为你没有启动一个。启动写入事务或删除 commitWrite 行。

    1. 启动事务并提交

      self.realm.beginWrite()
      
      self.realm.add(ConnectionState)
      
      try! self.realm.commitWrite()
      
    2. 删除提交写入

      try! self.realm.write {
           self.realm.add(ConnectionState)
      }
      

    Realm docs 有两个向数据库添加数据的示例。

    1. 使用realm.write 方法

      // Use them like regular Swift objects
      let myDog = Dog()
      myDog.name = "Rex"
      myDog.age = 1
      print("name of dog: \(myDog.name)")
      
      // Get the default Realm
      let realm = try! Realm()
      
      // Query Realm for all dogs less than 2 years old
      let puppies = realm.objects(Dog.self).filter("age < 2")
      puppies.count // => 0 because no dogs have been added to the Realm yet
      
      // Persist your data easily
      try! realm.write {
          realm.add(myDog)
      }
      
    2. 使用realm.beginWrite()realm.commitWrite()启动写事务并将数据提交到数据库

      let realm = try! Realm()
      
      // Break up the writing blocks into smaller portions
      // by starting a new transaction
      for idx1 in 0..<1000 {
        realm.beginWrite()
      
        // Add row via dictionary. Property order is ignored.
        for idx2 in 0..<1000 {
          realm.create(Person.self, value: [
            "name": "\(idx1)",
            "birthdate": Date(timeIntervalSince1970: TimeInterval(idx2))
          ])
        }
      
        // Commit the write transaction
        // to make this data available to other threads
        try! realm.commitWrite()
      }
      

    【讨论】:

    • 我错误地添加了 commitWrite,因为在搜索我的领域数据库时找不到任何记录。我已经下载了容器并选择显示包内容,但是没有 default.realm 可供我用浏览器打开。知道为什么会这样吗?
    • 是的,根据我上面的评论,我已按照该 SO 中的说明进行操作。问题是,一旦我进入 AppData 和文档,就没有 default.realm。作为应用程序组容器的一部分,我已将我的领域设置为指定位置。我的领域文件路径是 file:///private/var/mobile/Containers/Shared/AppGroup/B4D9C8F6-6A72-4539-A144-6AD622873A0A/db.realm
    • 你必须按照你刚才复制的路径走
    • 从我的容器中选择 showPackage 内容时,唯一可用的文件夹是 AppData,它本身具有 Documents、Library 和 tmp。根据路径,我没有看到任何文件夹,例如 Shared、Containers、AppGroup
    【解决方案2】:
    try! self.realm.write {
         self.realm.add(ConnectionState)
    }
    

    这段代码有点等价于(可能带有一些额外的错误处理):

    realm.beginWrite()
    ...
    try! realm.commitWrite()
    

    这意味着您尝试提交两次写入。

    只需像这样更改您的代码:

    try! self.realm.write {
         self.realm.add(ConnectionState)
    }
    
    // try! self.realm.commitWrite()
    

    【讨论】:

    • 好的,感谢您解决这个问题。但是当我选择为我的应用程序显示 Container 时,那里什么都没有?如何在领域浏览器中查看此记录。在设备上测试,而不是模拟器
    • 如果您的设备连接到您的开发者机器 - 您可以输出 Realm 数据文件的位置 (Swift = Realm.Configuration.defaultConfiguration.fileURL),然后使用 Realm 浏览器打开它。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多