Ios Sqlite.swift创建动态复杂查询
我有一个包含多列的表。 在应用程序中,我们期待添加4个动态过滤器,如(猫、大小、颜色、形状) 我们知道我们可以为sqllite创建一个过滤器,如下所示:Ios Sqlite.swift创建动态复杂查询,ios,swift,sqlite.swift,Ios,Swift,Sqlite.swift,我有一个包含多列的表。 在应用程序中,我们期待添加4个动态过滤器,如(猫、大小、颜色、形状) 我们知道我们可以为sqllite创建一个过滤器,如下所示: user = user.select(name) .filter((color == "Blue") && (size = "Big") && (cat="a") && (shape="round")) .order(name.asc, name) // ORD
user = user.select(name)
.filter((color == "Blue") && (size = "Big") && (cat="a") && (shape="round"))
.order(name.asc, name) // ORDER BY "email" DESC, "name"
.limit(5, offset: 0)
但是如果一个过滤器,比如说,对于颜色,我们要搜索所有颜色。那么
.filter((color == "?????") && (size = "Big") && (cat="a") && (shape="round"))
有没有关于如何为这种情况创建动态过滤器的想法 filter()方法采用表达式
参数,
可以使用逻辑运算符&&
,|
等动态创建复合表达式
简单的例子:
// Start with "true" expression (matches all records):
var myFilter = Expression<Bool>(value: true)
// Dynamically add boolean expressions:
if shouldFilterColor {
myFilter = myFilter && (color == "Blue")
}
if shouldFilterSize {
myFilter = myFilter && (size == "Big")
}
// ... etc ...
// Use compound filter:
query = user.select(name)
.filter(myFilter)
.order(name.asc, name)
.limit(5, offset: 0)
//以“true”表达式开头(匹配所有记录):
var myFilter=表达式(值:true)
//动态添加布尔表达式:
如果应该过滤颜色{
myFilter=myFilter&&(颜色==“蓝色”)
}
如果应该过滤{
myFilter=myFilter&&(大小=“大”)
}
// ... 等
//使用复合过滤器:
查询=用户。选择(名称)
.filter(myFilter)
.订单(name.asc,name)
.限制(5,偏移量:0)
由于某些原因,过滤器在我这边不起作用,它没有标记错误或警告,这似乎是一个很好的方法。我尝试过这个(删除了ifs),但没有运气。var myFilter=Expression(value:true)myFilter=myFilter&&(name==“Facebook”)@edse:我只能说,它在我的简单测试中起了作用。请注意,您可以使用println(myFilter.SQL)
和println(myFilter.bindings)
检查生成的SQL代码,这可能有助于隔离问题。毫无疑问,这是解决方案,但我似乎无法使其正常工作。这是我的代码,但不知道为什么在过滤时它不起作用S由于过滤器正在动态构建,因此可以通过设置基本查询来避免true
表达式:let base=users。选择(name.order(name.asc)。限制(5);让过滤:查询;如果shouldFilterColor{filtered=base.filter(color==“Blue”)}…
。