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