2016-04-15 14 views
0

文字列に一致するクラウドキットからレコードを取得する必要があります。NSPredicateはCloudkitの文字列に一致します

私は電子メールフィールドを持つユーザーレコードタイプを持っています。私は同じ電子メールで複数のレコードを持っていますが、レコードを取得する述語は得られません。

私はこれらのすべてを試してみた:

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email == %@", email)) 

私は値を持つ述語行うと::真を、私は1つを含むすべてのレコードを取得

let predicate = NSPredicate(format: "email = '[email protected]'") 
NSPredicate(format: "email == %@", argumentArray: [email]) 
NSPredicate(format: "email IN %@", [email]) 
NSPredicate(format: "email contains %@", email) 
NSPredicate(format: "email = %@", email) 
NSPredicate(format: "email == %@", email) 

私のクエリは、レコード・タイプを指定します私はしたい..私は確かに私はその電子メール、実際に複数のユーザーがいることを知っている..

私は何が欠けていますか?

編集

..

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email BEGINSWITH %@", email)) 

は仕事を行い、レコードを思い出させるが、私は完全に一致をしたいです!

+0

は 'LIKE'代わりに' '==仕事をしていますか? – HAS

答えて

1

私のアプリでこの同じ問題が発生しています。私の場合、多くの検索基準が満たされなければならないが、検索やフィルタの述語が私に最も大きな問題となっていた述語のリストを購読する必要がありました。私も試してみました:

let word1 = "Mac" 

let predicate = NSPredicate(format: "Title CONTAINS %@", word1) 

これは働いていたが、「単語1」は、単一のスペースのない単語と「タイトル」だった場合にのみ、クラウドの「文字列リストは」でした。

私はすべての私の研究に渡って来ているの明確化は、次のとおりです。

あなたは述語とどのようなことがありませんを作成する場合、用語「自己」を使用する必要があり、それは、検索文字列であるすべてのフィールドを検索しています。このような文字列、数値、日付など値オブジェクトのための

使用%の@:ここで私はApple's Website.

述語から得た情報は、次の変数の置換文字列をサポートしています。

フィールドの名前に%Kを使用します。この置換変数は、置換された文字列を使用してフィールド名を検索する必要があることを示します。

ただし、CONTAINS演算子は、リストメンバーシップのテストにのみ使用できます。ただし、それを使用してフルテキスト検索を自己キーパスと組み合わせて実行する場合は例外です。自己キーパスにより、サーバーは検索可能な文字列ベースのフィールドを指定されたトークン文字列で検索します。たとえば、 "self"が "blue"を含む述語文字列は、フルテキスト検索に含めるようにマークされたすべてのフィールドで単語 "blue"を検索します。タイプが文字列でないフィールドでは、自己キーパスを使用して検索することはできません。

私がやったことは、よりよい方法が必要ですが、私の「タイトル」プロパティはまだクラウド内の「文字列リスト」であり、私のコードではすべての単語の配列を作りました私のsearchTermとsearchTermの各単語を使って、別個のNSPredicateを作成し、それらをNSCompoundPredicateの一部として使用しました。その後、NSCompoundPredicateをサブスクリプションに追加し、それが機能しました。ここに私の例があります:

var searchCriteria: [NSPredicate] = [] 

for word in searchTerm { 
    let predicate = NSPredicate(format: "self CONTAINS %@", word) 
    searchCriteria.append(predicate) 
} 

let p2 = NSPredicate(format: "Price > %d", minPrice) 

let p3 = NSPredicate(format: "Price < %d", maxPrice) 

let p4 = NSPredicate(format: "Category == %d", category) 

searchCriteria.append(p2) 
searchCriteria.append(p3) 
searchCriteria.append(p4) 

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: searchCriteria) 

私はこれが役に立ちます。これを行うにはより良い方法が必要です。もし誰かが知っていれば、私にはCloudKitを使ってやることの良い説明がたくさんあると私に知らせてください。

+0

アップルが私のレーダーに返答して問題が修正されたと答えたのでおもしろいです...しかし私はメールをエンコードしていないので、それ以来問題はなかったので、テストできませんでした。 – JDM

+0

それは面白いです。あなたがそれをテストし終えると、それはあなたのために働きます、あなたがそれをやった方法を教えてください。 – avanalfen

1

私は同じ問題を抱えていましたが、私のケースではユーザーフィールドにクエリ可能なインデックスを追加することで解決できました。インデックスを追加した後、クエリを実行できるようにCloudKitに再度データを書き込む必要がありました。述語を作成するための

コード:

let user = "test-user" 
let userPredicate = NSPredicate(format: "user == %@", user)