2016-07-01 4 views
2

Можно ли передать несколько параметров NSPredicate, называя их вместо %@NSPredicate пройти «несколько» параметров по имени [в Swift]

К примеру, у меня есть directly-passed Parameters me и you.

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, не делает смысл для меня. Если вы знаете ответ в ответ быстро? – tika

ответ

5

Вы можете использовать NSPredicate-х predicateWithSubstitutionVariables (см Apple 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

ПРИМЕЧАНИЕ: Вы не будете иметь SQ L инъекций в приложении iOS. Если вы не позволяете пользователю вводить SQL-код, а затем отправляете этот SQL-сервер на сервер , нет риска атаки SQL-инъекции.

Основные данные и NSPredicate не работают таким образом.

Сказав это; вы можете использовать NSExpression экземпляров и построить NSComparisonPredicate из комбинации NSExpression штук.

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)") 

Комбинат NSComparisonPredicate с NSCompoundPredicate и вы можете построить все, что вы хотите.

Смежные вопросы