2017-01-11 16 views
1

レルムDBテーブルにレコードを追加しようとしています。レルムコミット書き込みエラー - 存在しない書き込みトランザクションをコミットできません

私は私が私のDBに必要なテーブルを表すクラスの接続を持っていると列を表すためにあるダイナミックVARS作成しました:私は書き込みを書き、コミットしようとしています私のコードに続いて

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 
を10

私は何が欠けていますか?私はConnectionStateクラスでinitsを持つ必要がありますか? commitWriteで追加する前に、私はレルムブラウザでdbを表示しようとしていました。デバイスをxCodeで見つけてコンテナをダウンロードすることを選択しましたが、空でした。それから私は私がcommitWrite

答えて

4

をあなたはbeginWrite呼ばせずにcommitWriteと呼ばれます。書き込みトランザクションを開始しなかったため、書き込みトランザクションをコミットできません。書き込みトランザクションを開始するか、またはcommitWrite行を削除してください。

  1. スタートトランザクションと

    self.realm.beginWrite() 
    
    self.realm.add(ConnectionState) 
    
    try! self.realm.commitWrite() 
    
  2. それをコミットRealm docsがデータベースにデータを追加する例を2つ持っているcommitWrite

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

を削除します。

  1. それをクリアするための

    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() 
    } 
    
+0

私はrealm dbを検索するときにレコードを見つけることができなかったので、私は誤ってcommitWriteを追加しました。私はコンテナをダウンロードしてパッケージの内容を表示することを選択しましたが、ブラウザで開くためのdefault.realmはありません。なぜこれがどんなアイデアですか? – user2363025

+0

ファイルが見つからない場合は、http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803 – Yannick

+0

をご覧ください。上記の私のコメントごとに。問題は、AppDataとドキュメントに入ると、default.realmが存在しないことです。アプリケーショングループコンテナの一部として、指定した場所に自分の領域を設定しました。私のレルムのファイルパスはfile:///private/var/mobile/Containers/Shared/AppGroup/B4D9C8F6-6A72-4539-A144-6AD622873A0A/db.realm – user2363025

4
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() 
+0

[OK]を感謝を書き込みトランザクションを開始し、データベースにデータをコミットする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) } 
  • 使用realm.beginWrite()realm.commitWrite()を使用してください。しかし、私のアプリケーション用にContainerを表示することを選択すると、そこには何もありません?レルムブラウザでこのレコードを確認するにはどうすればよいですか。 – user2363025

  • +0

    デバイスがデベロッパーマシンに接続されている場合は、Realmデータファイルの場所(Swift = Realm.Configuration.defaultConfiguration.fileURL)を出力してから、レルムブラウザを使用してそのファイルを開くことができます。 –

    関連する問題