2016-07-01 10 views
2

は、例えば代わり​​に%@NSPredicate

のそれらに名前を付けることにより、NSPredicateに複数のパラメータを渡すことが可能です[スウィフト中]の名前で、「複数」のパラメータを渡し、私はdirectly-passedパラメータmeyouを持っています。

public static func ConversationByUserId(userId : String) -> [Message] { 

    // Either Created By me and sent to you. 
    // Or, created by you and sent to me 


    let me = UserRepo.GetLoggedInUser()?.id 

    var format = "(createdBy == '" + me! + "' && createdTo == '" + userId + "') " 
    format += " || (createdBy == '" + userId + "' && createdTo == '" + me! + "') " 


    print(format) 
    //prints: (createdBy == '1' && createdTo == '5') || (createdBy == '5' && createdTo == '1') 


    let predicate = NSPredicate(format: format) 

    return Filter(predicate); 


} 

注:Filter(predicate)は操作を実行し、結果を返します。ここまでは順調ですね。私は期待される結果を得る。しかし、これはSQL攻撃のような問題を抱えている可能性があります。

私は以下のようなことをすることができますか?これまでのところ、私が達成している

var format = "(createdBy == @me && createdTo == @you) " 
    format += " || (createdBy == @you && createdTo == @me) " 


let predicate = NSPredicate(format: format, [ "me" : me, "you" : you ]) 

は次のとおりです。

format = "(createdBy == %@ && createdTo == %@) " 
    format += " || (createdBy == %@ && createdTo == %@) " 


    let predicate = NSPredicate(format: format, me!, you, me!, you) 
+0

NSComparisonPredicateを使用してSQLインジェクションを防止する方法については、以下を参照してください。http://stackoverflow.com/questions/3076894/how-to-prevent-sql-injection-in-core-data – Moshe

+0

@Moshe、Make not make私に感覚。迅速に回答を投稿することをご存じですか? – tika

答えて

5

を使用できNSPredicateのpredicateWithSubstitutionVariablesApple Docsを参照してください)。あなたが代わりに使用する値の代わりに「$変数」を使用して、いつものように述語を作成します。

var format = "(createdBy == $me && createdTo == $you) " 
format += " || (createdBy == $you && createdTo == $me) " 
let predicate = NSPredicate(format: format) 

その後、変数名とあなたが渡したい値で辞書を作成します。

let subVars = ["me" : me!, "you" : you!] 

、最終的には自分の価値観に置き換える変数名と述語を作成します。

let finalPredicate = predicate.predicateWithSubstitutionVariables(subVars) 
2

がNOTE:あなたはSQを持っているつもりはありませんiOSアプリケーションのL注入攻撃ユーザーがSQLで入力し、そのSQLをサーバーに送信している場合を除き、SQLインジェクション攻撃のリスクはありません。

コアデータとNSPredicateはそのようには機能しません。

と言われています。 NSExpressionインスタンスを使用し、NSExpressionの組み合わせからNSComparisonPredicateを構築することができます。

let me = 1123 //Example value 

let test = [["createdBy":1124,"name":"Fred"],["createdBy":1123,"name":"Jane"]] as NSArray 

let lhs = NSExpression(forKeyPath: "createdBy") 
let rhs = NSExpression(forConstantValue: me) 

let predicate = NSComparisonPredicate(leftExpression: lhs, rightExpression: rhs, modifier: NSComparisonPredicateModifier.DirectPredicateModifier, type: NSPredicateOperatorType.EqualToPredicateOperatorType, options: []) 

let results = test.filteredArrayUsingPredicate(predicate) 
print("Results: \(results)") 

NSCompoundPredicateNSComparisonPredicateを組み合わせると、あなたが欲しいものを構築することができます。