web-dev-qa-db-ja.com

RLMException: 'Primary key property' serial 'does not exist on object' Book 'Migrationing to Swift 4

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)のみで、データは含まれていません。主キーをコメント化すると実行されますが、このオブジェクトのレルムには何も保存されません。なぜクラッシュするのかわからない!

13
Hellojeffy

レルムでは、モデルのプロパティに@objc dynamic var属性が必要です。これが欠けていたものです。

レルムウェブサイト から:

レルムモデルプロパティは、基になるデータベースデータのアクセサーになるために@objc dynamic var属性を持っている必要があります。クラスが@objcMembers(Swift 4以降)として宣言されている場合、個々のプロパティはdynamic varとして宣言することができます。

19
Hellojeffy

必ずしも移行に関するものではありませんが、この問題を引き起こす可能性のある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

お役に立てば幸いです。

34
Gal Shahar
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"
    }
}
5
Khawar Islam

私の場合、クラス名の上に@objMembersを追加すると修正されました

例:

@objcMembers
internal final class Recipient: Mappable {
dynamic var transferID: String = ""
1
Kiki Sasha

私も同様の問題を抱えていましたが、私は非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"
}

エラーメッセージからそれが問題であることは明らかではありませんでしたが、すぐに問題が修正されました。

0
wildcat12

次のような新しいバージョンの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!
0
Deepak Kanyan