不能在Android应用程序中使用like子句

时间:2011-04-22 05:36:33

标签: android sqlite

我正在使用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但它不起作用。为什么?

7 个答案:

答案 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");

来自https://stackoverflow.com/a/46420813/908821