2011-04-22 70 views
12

我的数据库上的Android应用程序正与sqllite不能使用 我想用一个类似条款 前检索SM数据:像在Android应用条款

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

它应该给所有SONGNAME开始match_str但它不工作。为什么?

回答

25

此:

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

最终会变成这样,当SQL解释看到它:

" SongName LIKE '%=?%'" 

而且这将匹配包含lite的任何SongName ral“=?”我不认为这是你想要的东西。

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%_符号以及但是这作为练习留给读者。

+0

我使用edittext使用户能够搜索songs.i想要的应用程序使用它的即时srch我的意思是,我希望我的应用程序的列表视图中的搜索结果立即作为用户在编辑文本框中按照访问最多的歌曲的顺序输入。我正在使用一个DB的歌曲,但我恐怕它可能太慢了。此外,我希望我的edittext listner放慢速度,等待用户完成他的文本我使用System.currentTimeMillis()作为标记nd等待fr。 5秒不等。我是新来的机器人,不知道它会工作与否..请告诉我smthing – sayantan 2011-04-22 06:37:50

+0

@ user712771:这听起来像一个全新的问题,会更好地回答了一个比我更了解Android的人。 – 2011-04-22 07:09:44

+0

谢谢,但我真的认为你可以帮助..我想我应该问它作为一个单独的问题.. – sayantan 2011-04-22 09:13:23

1

不需要等号,你应该能够包括?无需使用+运算符即可。 where子句应该仅仅是:

"SongName LIKE '%?%'" 

,如果亩太短是正确的,你只需要为...

"SongName LIKE '?%'" 
+0

我认为你需要周围掉落的单引号'?',使其占位符,而不是一个字符串。 – 2011-04-22 05:57:59

+0

它似乎确定工作我的应用程序不断崩溃 – sayantan 2011-04-22 06:17:49

+0

谢谢亩,你是对的。我还没有真正使用过?并在我自己的查询选择参数,所以我没有100%清楚他们的用法... – Maximus 2011-04-22 06:46:10

0

喜,能得到任何异常,而在执行上面的查询。尝试删除相似条件下问号的“=”符号。否则,请尝试使用

db.rawQuery(sql, selectionArgs) 
9

试试这个:

String[] args = new String[1]; 
args[0] = "%"+song+"%"; 
Cursor friendLike = db.rawQuery("SELECT * FROM songs WHERE SongName like ?", args); 
+1

我想你想要'args [0] =歌曲+“%”;'因为他们说“从......开始”。 – 2011-04-22 05:49:00

+0

多数民众赞成多数民众赞成多数民众赞成在真正的,只有在参数后使用%获得**开始** ** – 2011-04-22 06:01:31

+0

伟大的工作很好......但我没有明白为什么上述解决方案没有奏效。 – sayantan 2011-04-22 06:18:06

0

这完全适用于我......

"Songname LIKE ? "... 

cursor = database.rawQuery(query, new String[]{"%" + searchTerm + "%"}); 
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 
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