не могу использовать как пункт в приложении для Android - PullRequest
12 голосов
/ 22 апреля 2011

Я работаю над базой данных с sqllite в приложении для Android. Я хочу получить данные sm с помощью предложения like, например:

Cursor c = myDB.query(MY_DATABASE_TABLE, null, " SongName LIKE '%"+"=?"+"%'" , 
           new String[]{match_str}, null, null,"SongHit  DESC");

Должно быть указано все SongName, начиная с match_str, но оно не работает. Почему

Ответы [ 7 ]

25 голосов
/ 22 апреля 2011

Это:

" SongName LIKE '%"+"=?"+"%'"

Будет выглядеть так, когда его увидит интерпретатор SQL:

" SongName LIKE '%=?%'"

И это будет соответствовать любому SongName, содержащему литерал "=?" и я не думаю, что это как то, что вы хотите.

A % соответствует любой последовательности символов в SQL LIKE, по сути, это то же самое, что .* в регулярном выражении; поэтому, если вы хотите соответствовать в начале, то вам не нужен ведущий %. Кроме того, ваш ? заполнитель должен находиться за пределами одинарных кавычек, иначе он будет интерпретироваться как буквальный знак вопроса, а не как заполнитель.

Вы хотите что-то похожее на это:

String[] a = new String[1];
a[0]       = match_str + '%';
Cursor   c = myDB.rawQuery("SELECT * FROM songs WHERE SongName LIKE ?", a);

Если вы хотите быть по-настоящему строгим, вам также придется избегать символов % и _ внутри match_str, но это оставлено в качестве упражнения для читателя.

9 голосов
/ 22 апреля 2011

Попробуйте это:

String[] args = new String[1];
args[0] = "%"+song+"%";
Cursor friendLike = db.rawQuery("SELECT * FROM songs WHERE SongName like ?", args);
1 голос
/ 22 апреля 2011

Нет необходимости в знаке равенства, и вы должны иметь возможность включить? прямо в строке без оператора +. Предложение where должно быть просто:

"SongName LIKE '%?%'"

и если mu слишком короток, это правильно, и вы хотите начать только с ...

"SongName LIKE '?%'"
0 голосов
/ 26 сентября 2017

простой способ - использовать оператор конкатенации ||

"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

0 голосов
/ 23 февраля 2017

Если вы хотите использовать 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
0 голосов
/ 09 ноября 2015

Это прекрасно работает для меня ...

"Songname LIKE ? "...

cursor = database.rawQuery(query, new String[]{"%" + searchTerm + "%"});
0 голосов
/ 22 апреля 2011

привет Получаете ли вы какие-либо исключения при выполнении вышеуказанного запроса. Попробуйте удалить символ «=» перед знаком вопроса в аналогичном состоянии. Еще попробуйте использовать

db.rawQuery(sql, selectionArgs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...