2011-10-04 16 views
9

Bu konuda yeniyim, lütfen bana yardım edin.Android ormlite like() işlevi çalışmıyor

(Sütun adı, değer) işlevi gibi ormlite kullanmaya çalışıyorum, ancak bu benim için çalışmıyor. Ama tam metni test ettiğimde "eq" işlevi gibi çalışıyor. Benim Kod olduğu

,

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); 
} 

teşekkürler.

cevap

11

Eğer% joker kullanmak gerekir Kısmi eşleme yapmak istiyorsanız, tam dize 'madeCompany' olmasını istiyoruz Oldukça basit vb

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

Eski bir soru, ama çözdüğüm bir şey (ORMLite'ın belgeleri açık değil). sorgu dizginizin hangi tarafının herhangi bir sayıda karakterle eşleşebileceğini ORMLite söylemek için sorgu parametrenizi "%" lerde sarmanız gerekir.

Örneğin

, kendi sorgu dize aşağıdaki kullanmak içeren herhangi madeCompany eşleştirmek istiyorsanız: teneke üstünde

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); 
} 
+1

Ayrıca çalışmak için kesme işareti eklediğinizden emin olun: qb.where(). Like ("madeCompany", "'%" + filterKey + "%'"); –

+0

@Justin: Kod snippet'ine teşekkürler. Aslında bir şey gibi bir sorgunun olmasını istiyorum, "Eğer B yazıyorsam, o zaman önce B dizelerini (sonra A ile başlıyor olsa da) B dizelerini göstermelidir". Bunun için bir yolu var mı? –

1

cevaplar gibi sorgu sorunu çözdük, ancak SQL enjeksiyon riski vardır. 'FilterKey' değeri 'ise, SQLException neden olur, çünkü SQL SELECT * OLARAK XXX WHERE xxx'% '%' GİBİ olur. Bu vaka için, örnek önlemek için SelectArg kullanabilirsiniz:

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); 
} 

Referans: