2011-10-04 30 views
9

我是新手,請幫助我。Android ormlite like()函數不起作用

我想使用ormlite像(列名,值)函數,但這不適用於我。但是當我測試全文時,它就像「eq」函數一樣工作。

我的代碼是,

try { 
    QueryBuilder<MakeDTO, Integer> qb = makeDao.queryBuilder(); 
    qb.where().like("madeCompany", filterKey); 
    PreparedQuery<MakeDTO> pq = qb.prepare(); 
    return makeDao.query(pq); 
} catch (SQLException e) { 
    throw new AppException(e); 
} 

感謝。

回答

11

很簡單,你問它是完全字符串「madeCompany」,如果你想要做的部分匹配你需要使用%通配符等

public Where<T,ID> like(java.lang.String columnName, 
         java.lang.Object value) 
       throws java.sql.SQLException 
Add a LIKE clause so the column must mach the value using '%' patterns. 
Throws: 
java.sql.SQLException 

Where.like(java.lang.String, java.lang.Object)

29

一個古老的問題,但我剛剛解決了一些問題(ORMLite的文檔不太清楚)。您需要將查詢參數包裝在「%」中以便告訴ORMLite查詢字符串的哪一側可以匹配任意數量的字符。

例如,如果你希望你的查詢匹配的是包含你的字符串中使用下列任何madeCompany:

try { 
    QueryBuilder<MakeDTO, Integer> qb = makeDao.queryBuilder(); 
    qb.where().like("madeCompany", "%"+filterKey+"%"); 
    PreparedQuery<MakeDTO> pq = qb.prepare(); 
    return makeDao.query(pq); 
} catch (SQLException e) { 
    throw new AppException(e); 
} 
+0

幫助了我。謝謝:) – Shirane85

+1

請務必添加撇號來工作:qb.where()。like(「madeCompany」,「'%」+ filterKey +「%'」); –

+0

@Justin:感謝代碼片段。其實我想要一個類似這樣的查詢,「如果我輸入B,那麼它應該首先顯示B的字符串,然後是包含B的字符串(雖然它以A開頭)」。這是一種方式嗎? –

1

上述罐的回答解決類似問題的查詢,但有SQL注入風險。如果'filterKey'的值爲'',則會導致SQLException,因爲SQL將是SELECT * FROM XXX WHERE xxx LIKE'%'%'。你可以使用SelectArg避免的,例如這種情況:

try { 
    String keyword = "%"+filterKey+"%"; 
    SelectArg selectArg = new SelectArg(); 
    QueryBuilder<MakeDTO, Integer> qb = makeDao.queryBuilder(); 
    qb.where().like("madeCompany", selectArg); 
    PreparedQuery<MakeDTO> pq = qb.prepare(); 
    selectArg.setValue(keyword); 
    return makeDao.query(pq); 
} catch (SQLException e) { 
    throw new AppException(e); 
} 

參考:http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#index-select-arguments