2011-04-22 75 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