Предикат Bool вызывает нулевое количество строк - PullRequest
1 голос
/ 21 апреля 2019

Когда я пытаюсь выполнить запрос на выборку CoreData, я получаю правильное количество строк.

let req = Track.fetchRequest()
return try context.count(for: req)

// result: 81

Работает:

SQLite browser request

Когда я пытаюсь добавить условие 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

1 Ответ

0 голосов
/ 22 апреля 2019

Это комментарий с обходным решением.

Что помогло, так это сочетание:

  1. set track.isSentToServer = false для new объектов явно
  2. набор track.time = Date() для новый объекты явно (я не использую это поле в предикате) (сгенерированный тип: Date?)

В результате предикат работает.

Хотя мои ожидания были довольно логичными:

  1. false должно быть значением по умолчанию, так как оно имеет тип Bool (не Bool?).
  2. nil должно быть значением по умолчанию для атрибута Date?, и оно не должно влиять на предикаты, которые его не упоминают.

Мне не удалось найти информацию, это поведениезадокументировано или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...