Модель области содержит свойство, но не обнаружила его во время выполнения - PullRequest
0 голосов
/ 05 сентября 2018

Я получаю ошибку, как показано ниже

Неверное имя свойства, причина: «Свойство« IsRecordDeleted »не найдено в объекте типа« 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 в предикате.

Скажите, пожалуйста, в чем может быть проблема

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я думаю, вы обнаружите, что простое переключение на блоки фильтров вместо строковых предикатов может остановить сбой, но не даст ожидаемых результатов.

Это потому, что IsRecordDeleted никогда не сохраняется в базе данных. Это не тот тип, который может быть представлен в Objective-C, поэтому он не может быть dynamic, поэтому Realm игнорирует его.

Возьмем для примера следующий класс:

@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 для этих объектов, используя realm.objects(MyObject.self), вы получите что-то вроде этого

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 для этого точного случая, который вы можете посмотреть здесь .

0 голосов
/ 05 сентября 2018

Вы можете попробовать

let mSavedItems = mDbHelper.realmObj.objects(MyCustomModel.self)
let filtered = mSavedItems.filter { $0.IsRecordDeleted == false }

и

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

Для обоих

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

//

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