领域模型包含 属性 但在运行时未找到

Realm model contains property but not found it at runtime

我收到如下错误

Invalid property name , reason: 'Property 'IsRecordDeleted' not found in object of type 'MyCustomModel'

我的模型在

@objcMembers public class MyCustomModel : Object {
dynamic var   Id : String = ""
dynamic var   ProductId : String? = ""
dynamic var   IsRecordDeleted : Bool? = false
dynamic var   ProductBarcode : String? = ""


override public class func primaryKey() -> String? {
    return "Id"
}

}

我正在这样查询:

let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self).filter("IsRecordDeleted = false")

这里可能有什么问题。我不知道为什么我的应用程序会因同样的错误而崩溃。但是如果我改变

这样的值
    let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self).filter("ProductId = 0")

应用程序获得 运行,但当我在谓词中使用 IsRecordDeleted 时崩溃了。

请告诉我可能是什么问题

你可以试试

let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self)
let filtered = mSavedItems.filter { [=10=].IsRecordDeleted == false }

let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self) 
let filtered = mSavedItems.filter { [=11=].ProductId == "0" }

两者都

let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self) 
let filtered = mSavedItems.filter {
   [=12=].IsRecordDeleted == false 
   && [=12=].ProductId == "0" 
}

//

let resultPredicate = NSPredicate(format: "ProductId == '0' AND IsRecordDeleted == false")
let filtered = mSavedItems.filter(resultPredicate)

我认为您会发现简单地切换到过滤器块而不是字符串谓词可能会停止崩溃,但不会产生预期的结果。

这是因为 IsRecordDeleted 永远不会保存到数据库中。它不是Objective-C中可以表示的类型,因此它不能是dynamic,所以Realm会忽略它。

以下为例class:

@objcMembers class MyObject: Object {
    dynamic var id = ""
    dynamic var testBool: Bool? = false

    override static func primaryKey() -> String {
        return "id"
    }
}

假设我们这样初始化它们:

    let obj1 = MyObject()
    obj1.id = "1"
    obj1.testBool = true

    let obj2 = MyObject()
    obj2.id = "2"
    obj2.testBool = false

    let realm = try? Realm()
    try? realm?.write {
        realm?.add(obj1, update: true)
        realm?.add(obj2, update: true)
    }

如果我们使用 realm.objects(MyObject.self) 在 Realm 中查询这些对象,您将得到类似这样的结果

Results<MyObject> <0x7fe410c0ad90> (
    [0] MyObject {
        id = 1;
    },
    [1] MyObject {
        id = 2;
    }
)

你会看到在数据库中,确实没有名为 testBool 的 属性,这是我们可选的 Bool

你可以很容易地看到可选的 Bool 如果你这样写它可能会导致问题:

class MyObject: Object {
    @objc dynamic var id = ""
    @objc dynamic var testBool: Bool? = false   // This line will not compile.

    override static func primaryKey() -> String {
        return "id"
    }
}

我很好奇为什么 IsRecordDeleted 首先需要是可选的,因为它似乎从一开始就有价值。如果没有,那么像这样的东西将按预期工作:

@objcMembers public class MyCustomModel: Object {
    dynamic var Id: String = ""
    dynamic var ProductId: String? = ""
    dynamic var IsRecordDeleted: Bool = false
    dynamic var ProductBarcode: String? = ""


    override public class func primaryKey() -> String? {
        return "Id"
    }
}

您可以像最初尝试的那样通过字符串进行查询。

如果 必须 是可选的,那么 Realm 会针对这种情况提供 RealmOptional,您可以查看 here.