Android ormlite like()函数不起作用

问题描述:

我是新手,请帮助我。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); 
} 

感谢。

很简单,你问它是完全字符串“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)

一个古老的问题,但我刚刚解决了一些问题(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开头)”。这是一种方式吗? –

上述罐的回答解决类似问题的查询,但有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