前提・実現したいこと
Realm SwiftでCompound Key(複合主キー)を使った際、1度目はデータの保存ができるのですが2回目以降複合主キーを構成する2つのうちの1つの値をかえてデータを保存するとクラッシュしてしまうのでクラッシュしないようにしたいです。
IceCreamというRealmとCloudKitのデータを同期するライブラリを使用するためにPrimary Keyが必要で仮にNSUUID().uuidStringで取得した文字列をPrimary Keyとして指定いた際は問題なくデータも複数デバイスで同期され動かすことができていました。ですがシステム上バグが出てしまう部分があったためやはりCompound Keyを使う必要に駆られCompound Keyを導入しました。
RealmにおけるCompound Keyの設定についてはrealmのGitHubのIssue#1192のやりとりを参考にして実現しました。
発生している問題・エラーメッセージ
App内でTable Columnデータを保存すると1度目は問題なく保存することができるのですが2回目以降ができません。
Terminating app due to uncaught exception 'RLMException', reason: 'Attempting to create an object of type 'TableColumn' with an existing primary key value ''.'
エラーメッセージによると
「既に存在しているprimary key value '' でTableColumnオブジェクトを作ろうとしている」
とのことですが、DB(CloudKit(以下画像参照)でもRealmでも)を見るとprimary key valueが Test.2019/07/20 となっており適切なCompoudKeyがPrimary Keyとしてデータが保存されており、'' がPrimary Keyになっているオブジェクトはないですし、2回目の保存の際もprimary key value(今回の場合はCompoundKeyの値)は1度目の保存と同じ方法でなされているので '' にはならないと考えられます。
ですので一体どこに問題があるのかがわかりかねている状況です。
該当のソースコード
以下Modelの dynamic var 前の @objc と 2つのextension はIceCreamの使用に必要なものです。
Model
1class TableColumn: Object { 2 3 @objc dynamic var columnScore = Int16() 4 @objc dynamic var createdTime = String() 5 @objc dynamic var valid = Bool() 6 @objc dynamic var isDeleted = false 7 @objc dynamic var columnName = String() 8 @objc dynamic var recordedDate = String() 9 @objc dynamic var compoundKey = String() 10 11 override static func primaryKey() -> String? { 12 return "compoundKey" 13 } 14 15 func configure(columnName: String, recordedDate: String){ 16 self.columnName = columnName 17 self.recordedDate = recordedDate 18 self.compoundKey = self.columnName + "." + self.recordedDate 19 20 } 21} 22 23extension TableColumn: CKRecordConvertible { 24 25} 26 27extension TableColumn: CKRecordRecoverable { 28 29}
以下viewControllerのデータ保存箇所です。
viewController
1let tableColumn = TableColumn() 2 3tableColumn.configure(columnName: uniqueColumnName, recordedDate: recordedDate) 4tableColumn.setValue(tableColumn.compoundKey, forKey: "compoundKey") 5 6tableColumn.setValue(uniqueColumnName, forKey: "columnName") 7tableColumn.setValue(0, forKey: "columnScore") 8tableColumn.setValue(recordedDate, forKey: "recordedDate") 9tableColumn.setValue(createdTime, forKey: "createdTime") 10tableColumn.setValue(true, forKey: "valid") 11 12self.tableColumns.append(tableColumn) 13 14do { 15 try self.realm.write { 16 self.realm.add(self.tableColumns) 17 } 18} catch { 19 print("Error saving (error)") 20}
試したこと
こちらの "Realm Swift でのプライマリキー重複エラーについて" の質問がまさに同じ問題かもしれないと思い参考にさせていただいたのですが今回の私の問題には当てはまりそうにありませんでした。
皆様のお力添えいただけますと幸いです。
何卒よろしくお願いいたします。
補足情報(言語/FW/ツール等のバージョンなど)
Swift 5.0.1
Xcode 10.2.1
Realm Swift 3.17.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/20 15:28