2017-01-13 3 views
2

Я новичок в Mac и пишу свое первое приложение с использованием Core Data. У меня есть модель данных, в которой есть сущность SizeRecord, которая имеет один атрибут «размер» и отдельные отношения «файлы», который является набором ссылок FileRecord. Я могу создать SizeRecord и правильно сохранить его в базе данных. Я также возможность получить запись из базы данных:Основные данные Предикат не работает

let sizeFetch: NSFetchRequest<SizeRecord> = SizeRecord.fetchRequest() 
    let size: UInt64 = 106594 
    //sizeFetch.predicate = NSPredicate(format: "size == %i", size) 
    do { 
     let fetchedSizes = try dbCtx.ctx.fetch(sizeFetch) 
    } catch { 
    } 

Вэни я бег это, fetchedSizes массив содержит единственную сгружена запись, как ожидалось:

▿ 1 element 
- 0 : <SizeRecord: 0x10584fcc0> (entity: SizeRecord; id: 0x100495ea0 <x-coredata://F7EC8A0C-06E1-46AE-A875-34E4523AAC2A/SizeRecord/p1> ; data: { 
files =  (
    "0x100336310 <x-coredata://F7EC8A0C-06E1-46AE-A875-34E4523AAC2A/FileRecord/p2>" 
); 
size = 106594; 

однако, когда я раскомментировать предикат выше, я получаю в результате получается пустой массив. Это содержание sizeFetch:

<NSFetchRequest: 0x1058e4890> (entity: SizeRecord; predicate: (SIZE == 106594); sortDescriptors: ((null)); type: NSManagedObjectResultType;) 

Пожалуйста, поймите, что я делаю неправильно? Это должно быть что-то очень просто и глупо :)

ответ

5

«SIZE» является зарезервированного слова в синтаксисе строки формата предикат, см в «Predicate Руководства по программированию» Predicate Format String Syntax.

Решение использовать расширение в %K ключевое слово (которое обычно хорошая идея, чтобы избежать конфликтов с зарезервированными словами):

NSPredicate(format: "%K == %i", "size", size) 

или даже лучше с #keyPath директивой, которая позволяет компилятору к проверьте:

NSPredicate(format: "%K == %i", #keyPath(SizeRecord.size), size)