Когда я пытаюсь выполнить запрос на выборку CoreData, я получаю правильное количество строк.
let req = Track.fetchRequest()
return try context.count(for: req)
// result: 81
Работает:
Когда я пытаюсь добавить условие bool,
let req = Track.fetchRequest()
req.predicate = NSPredicate(format: "isSentToServer = NO")
return try context.count(for: req)
// result: 0
это не так. Результат всегда 0 (но все равно должно быть 81 ), что бы я ни пытался:
NSPredicate(format: "isSentToServer = %i", NSNumber(value: false))
NSPredicate(format: "isSentToServer = %@", NSNumber(value: false))
NSPredicate(format: "isSentToServer = 0")
NSPredicate(format: "isSentToServer = %@", false)
NSPredicate(format: "isSentToServer = %@", 0)
NSPredicate(format: "isSentToServer != YES")
NSPredicate(format: "isSentToServer == NO")
NSPredicate(format: "isSentToServer == %@", "NO")
ПРИМЕЧАНИЕ. isSentToServer
- это правильно распознанный атрибут, изменение регистра или добавление Z
не поможет.
Есть ли какие-либо изменения, о которых не знают авторы Swift Tutorial?
РЕДАКТИРОВАТЬ: Track
класс автоматически генерируется редактором сущностей Базовой модели, и тип данных isSentToServer равен Bool
(«Boolean» в редакторе) (не Bool?
)
UPDATE
Вот вывод из моего тестового кода с -com.apple.CoreData.SQLDebug 1
как предложено (предикат: isSentToServer != YES
):
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode=wal
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
CoreData: sql: SELECT COUNT(*) FROM ZTRACK
CoreData: annotation: total count request execution time: 0.0004s for count of 90.
Total track objects: 90
CoreData: sql: SELECT COUNT( DISTINCT t0.Z_PK) FROM ZTRACK t0 WHERE t0.ZISSENTTOSERVER <> ?
CoreData: annotation: total count request execution time: 0.0005s for count of 0.
Track objects pending upload: 0
Для = NO
и других «равных» случаев он генерирует SQL "= ?"
вместо
Как мне создать Track
объектов?
let track = Track(context: context) // context is from AppDelegate, auto-generated by Xcode
// set up some properties
// not assigning any isSentToServer value explicitly
context.save() // no errors
РЕДАКТИРОВАТЬ 2: Обратите внимание, что я попытался «стереть данные» симулятора iPhone 6 в моем XCode, и заново создал мои объекты Track, но второй запрос возвращает нулевое количество строк.
Xcode: версия 10.2 (10E125)
Targeting iOS SDK / версия: 11.0 или 12.2, без разницы
$ xcodebuild -showsdks
iOS SDKs:
iOS 12.2 -sdk iphoneos12.2
iOS Simulator SDKs:
Simulator - iOS 12.2 -sdk iphonesimulator12.2