2017-01-13 13 views
2

私はMacには初めてで、コアデータを使用して私の最初のアプリケーションを作成しています。私は単一の属性 "サイズ"とFileRecord参照のセットである単一の関係 "ファイル"を持つエンティティSizeRecordがあるデータモデルを持っています。 SizeRecordを作成し、データベースに適切に保存することができました。私はまた、データベースからレコードを取得することができる午前:コアデータ述語が機能しない

▿ 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; 

私は上記の述語のコメントを解除する場合しかし、私が取得:

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配列は、予想通り、単一のフェッチされたレコードが含まれています結果として空の配列これはサイズのコンテンツです.Fetch:

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

私が間違っていることをお考えですか?それは非常にシンプルで愚かなものでなければならない:)

答えて

5

「SIZE」は述語形式の文字列の構文で予約語で、 は「述語プログラミングガイド」のPredicate Format String Syntaxご覧ください。

ソリューションは、(一般的に 予約語との競合を避けるために、良いアイデアです)%Kキーワード展開を使用することです:

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

またはより良いにコンパイラ を可能#keyPathディレクティブでプロパティ名:

NSPredicate(format: "%K == %i", #keyPath(SizeRecord.size), size) 
関連する問題