Android 编写查询以删除sqlite中特殊记录的4个首字母
我的原始代码是:Android 编写查询以删除sqlite中特殊记录的4个首字母,android,sql,sqlite,android-sqlite,Android,Sql,Sqlite,Android Sqlite,我的原始代码是: c = mydb.rawQuery("select dId,dWord FROM german where dWord like '%" + search + "%'", null); 它返回了完整的记录,如下图所示。 我改变了代码,以遵循代码,但它也有问题 c = mydb.rawQuery("select dId, case when substr(dWord, 1, 4) in ('das ', 'der ','die ') then substr(dWord, 5
c = mydb.rawQuery("select dId,dWord FROM german where dWord like '%" + search + "%'", null);
它返回了完整的记录,如下图所示。
我改变了代码,以遵循代码,但它也有问题
c = mydb.rawQuery("select dId, case when substr(dWord, 1, 4) in ('das ', 'der ','die ') then substr(dWord, 5, length(dWord) - 4) else dWord end as dWord from german where dWord like '%"+search+"%'",null);
它不显示4个字母,这是好的,但它显示的记录有这个前缀('das','der','die'),它不应该是这样的。它必须返回只包含搜索字符的记录。在照片中,你们可以看到它返回了带有前缀的记录。
在第二个代码之后搜索“das”,它应该返回在其主体上包含das的单词,而不是在删除的前缀上。我希望我能解释清楚 在SQLite中,连接运算符是
|
,而不是+
也不要直接连接参数
search
,而是使用?
占位符并在rawQuery()的第二个参数处传递search
。这是避免的安全方法:
如果WHERE
子句中的dWord
列是CASE
表达式的结果,则将语句更改为:
String sql = "select t.* from (select dId, " +
"case when substr(dWord, 1, 4) in ('das ', 'der ','die ') " +
"then substr(dWord, 5) else dWord end as dWord " +
"from german) t where t.dWord like '%' || ? || '%' " +
"order by instr(t.dWord, ?), t.dWord"
c = mydb.rawQuery(sql, new String[] {search, search});
谢谢,但是,它没有改变任何东西,它返回了像第一张照片这样的记录。代码工作正常。检查这个简化的演示:我不能告诉你如何在你的代码中使用它。还有:对于搜索模式'das'
澄清一些事情:它应该返回在主体上包含das的单词,而不是在删除的前缀上。这是否意味着搜索模式是针对删除4个字符后的dWord的剩余部分?我的英语不是很好,我也解释不清楚。我试图举例说明。我的数据库中有这些词:1-das公寓2-das Gluck 3-die Hand 4-仪表板5-dasselbe 6-alandas 7-皮肤科8-irmander 9-trandie 10-der tisch,运行后查询并过滤这些词('das'),它应该显示以下记录:1-仪表板2-dasselbe 3-alandas或如果我过滤('der'):1-irmander
String sql = "select t.* from (select dId, " +
"case when substr(dWord, 1, 4) in ('das ', 'der ','die ') " +
"then substr(dWord, 5) else dWord end as dWord " +
"from german) t where t.dWord like '%' || ? || '%' " +
"order by instr(t.dWord, ?), t.dWord"
c = mydb.rawQuery(sql, new String[] {search, search});