Swift 4コンパイルを使用してiOS上のレルムでこの問題が発生しています。起動時に次のメッセージでアプリがクラッシュします。
RLMException', reason: 'Primary key property 'serial' does not exist on object 'Book''
同じようなエラーメッセージが表示されましたが、同じものではありませんでした。これは私のオブジェクトがどのように見えるかです
import Foundation
import RealmSwift
class Book: Object {
dynamic var serial: String = ""
dynamic var title: String = ""
dynamic var pages: Int = 0
dynamic var genre: String = ""
override static func primaryKey() -> String? {
return "serial"
}
}
Realm Browserアプリでdefault.realmファイルを確認したところ、エントリに含まれているのは#(0,1,2)のみで、データは含まれていません。主キーをコメント化すると実行されますが、このオブジェクトのレルムには何も保存されません。なぜクラッシュするのかわからない!
レルムでは、モデルのプロパティに@objc dynamic var
属性が必要です。これが欠けていたものです。
レルムウェブサイト から:
レルムモデルプロパティは、基になるデータベースデータのアクセサーになるために
@objc dynamic var
属性を持っている必要があります。クラスが@objcMembers
(Swift 4以降)として宣言されている場合、個々のプロパティはdynamic var
として宣言することができます。
必ずしも移行に関するものではありませんが、この問題を引き起こす可能性のあるiOS 13とXcode 11に問題があります。デフォルトのString
値が設定されているRealmクラスのすべてのStringプロパティは、どういうわけか無視されます。これを修正するには、最新バージョン(現在は3.19.1)に更新し、Xcode:Product-> Clean Build Folderで更新します。
ココアポッドを使用している場合は、次のようにします。
プロジェクトのPodfileを開き、RealmSwift行を次の行に置き換えます。
pod 'RealmSwift', '~> 3.19.1'
次に、プロジェクトのフォルダーでターミナルを開き、次のようにします。
pod repo update
pod install
お役に立てば幸いです。
import Foundation
import RealmSwift
class Book: Object {
@objc dynamic var id : Int = 0
@objc dynamic var serial: String = ""
@objc dynamic var title: String = ""
@objc dynamic var pages: Int = 0
@objc dynamic var genre: String = ""
override static func primaryKey() -> String? {
return "id"
}
}
私の場合、クラス名の上に@objMembersを追加すると修正されました
例:
@objcMembers
internal final class Recipient: Mappable {
dynamic var transferID: String = ""
私も同様の問題を抱えていましたが、私は非RealmクラスをRealmクラスに変換していたことが原因でした。私はもともと持っていました:
@objc dynamic let customerId: String
override static func primaryKey() -> String? {
return "customerId"
}
...しかし、「let」を「var」に変更する必要がありました。
@objc dynamic var customerId: String
override static func primaryKey() -> String? {
return "customerId"
}
エラーメッセージからそれが問題であることは明らかではありませんでしたが、すぐに問題が修正されました。
次のような新しいバージョンのRealmを使用して、PodファイルのRealmを変更します。
から
pod 'RealmSwift', '~> 3.11.0'
に
pod 'Realm', git: 'https://github.com/realm/realm-cocoa.git', branch: 'master', submodules: true
pod 'RealmSwift', git: 'https://github.com/realm/realm-cocoa.git', branch: 'master', submodules: true
すべてのフィールドが次のように定義されていることを確認してください:
@objc dynamic var myID: String!