2011-10-04 35 views
9

Tôi mới làm quen với điều này, hãy giúp tôi.Chức năng Android ormlite like() không hoạt động

Tôi đang cố gắng sử dụng chức năng ormlite (tên cột, giá trị), nhưng điều này không hiệu quả đối với tôi. Nhưng khi tôi kiểm tra toàn văn, nó hoạt động giống như chức năng "eq".

Mã của tôi là,

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

Cảm ơn.

Trả lời

11

Khá đơn giản, bạn đang yêu cầu nó để được chính xác chuỗi 'madeCompany', nếu bạn muốn làm khớp một phần bạn cần phải sử dụng các ký tự đại diện% vv

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

Một câu hỏi cũ, nhưng điều tôi vừa giải quyết (tài liệu của ORMLite không rõ ràng). bạn cần phải bọc tham số truy vấn của bạn trong "%" để nói cho ORMLite biết bên nào của chuỗi truy vấn của bạn có thể khớp với bất kỳ số ký tự nào.

Ví dụ, nếu bạn muốn truy vấn của bạn để phù hợp với bất kỳ madeCompany có chứa chuỗi bạn sử dụng như sau:

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

đã giúp tôi. Cảm ơn người đàn ông :) – Shirane85

+1

hãy nhớ thêm dấu nháy đơn vào công việc: qb.where(). Like ("madeCompany", "'%" + filterKey + "%'"); –

+0

@Justin: Cảm ơn đoạn mã. Trên thực tế tôi muốn có một truy vấn giống như, "Nếu tôi gõ B thì trước tiên nó sẽ hiển thị các chuỗi của B sau đó các chuỗi có chứa B (mặc dù nó bắt đầu với A)". Nó là một cách cho điều đó? –

1

Những câu trả lời trên có thể giải quyết vấn đề truy vấn như thế nào, nhưng có nguy cơ SQL injection. Nếu giá trị của 'filterKey' là ', nó sẽ gây ra SQLException, vì SQL sẽ là SELECT * FROM XXX WHERE xxx LIKE'% '%'. Bạn có thể sử dụng SelectArg để tránh, ví dụ cho trường hợp này:

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

tham khảo: http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#index-select-arguments

Các vấn đề liên quan