我正在使用Android应用程序中的sqllite数据库 我想使用like子句检索sm数据 例如:
Cursor c = myDB.query(MY_DATABASE_TABLE, null, " SongName LIKE '%"+"=?"+"%'" ,
new String[]{match_str}, null, null,"SongHit DESC");
它应该给所有以match_str开头的SongName但它不起作用。为什么?
答案 0 :(得分:25)
此:
" SongName LIKE '%"+"=?"+"%'"
当SQL解释器看到它时,最终会看起来像这样:
" SongName LIKE '%=?%'"
这将匹配任何包含文字“=?”的SongName。而且我认为这并不像你想要的那样。
%
匹配SQL LIKE中的任何字符序列,它与正则表达式中的.*
基本相同;所以,如果你想在开头匹配,那么你不需要领先的%
。此外,您的?
占位符必须位于单引号之外,否则将被解释为文字问号而不是占位符。
你想要更像这样的东西:
String[] a = new String[1];
a[0] = match_str + '%';
Cursor c = myDB.rawQuery("SELECT * FROM songs WHERE SongName LIKE ?", a);
如果你想要非常严格,你也必须在%
内逃避_
和match_str
符号,但这仍然是读者的练习。
答案 1 :(得分:9)
试试这个:
String[] args = new String[1];
args[0] = "%"+song+"%";
Cursor friendLike = db.rawQuery("SELECT * FROM songs WHERE SongName like ?", args);
答案 2 :(得分:1)
不需要等号,你应该能够包含?在字符串中,不需要+运算符。 where子句应该只是:
"SongName LIKE '%?%'"
如果mu太短是正确的,你只想从...开始
"SongName LIKE '?%'"
答案 3 :(得分:0)
嗨执行上述查询时是否收到任何异常。尝试在类似条件下删除问号前面的“=”符号。否则尝试使用
db.rawQuery(sql, selectionArgs)
答案 4 :(得分:0)
这对我来说非常有用......
"Songname LIKE ? "...
cursor = database.rawQuery(query, new String[]{"%" + searchTerm + "%"});
答案 5 :(得分:0)
如果您希望使用query()
代替rawQuery()
,可以这样做:
// searchString is the string to search for
final String whereClause = "MyColumnName" + " like ?";
String[] whereArgs = new String[]{"%" + searchString + "%"};
Cursor cursor = sqLiteDatabase.query("MyTableName",
null, // columns
whereClause, // selection
whereArgs, // selectionArgs
null, // groupBy
null, // having
null, // orderBy
null); // limit
答案 6 :(得分:0)
一种简单的方法是使用连接运算符||
"SongName LIKE '%'||?||'%'"
因此无需编辑match_str。
Cursor c = myDB.query(MY_DATABASE_TABLE, null, " SongName LIKE '%'||?||'%'" ,
new String[]{match_str}, null, null,"SongHit DESC");