2015-04-22 18 views
6

Tôi đã một tập hợp các loại khác nhau của các đối tượng vẫn kiên trì trong cơ sở dữ liệu Realm. Bây giờ tôi muốn truy vấn một số loại đối tượng nhất định bao gồm tất cả các trường của đối tượng đó. Phương pháp tôi đã viết bên dưới, là nhận tất cả các trường được khai báo của đối tượng và lặp lại trên các trường để kiểm tra xem chuỗi truy vấn đã cho có được chứa hay không.Query Trong Cơ sở dữ liệu Realm: Tìm tất cả các đối tượng Chứa Query String

Nó hoạt động tốt cho các loại trường chuỗi nhưng ném java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER. cho giá trị số nguyên vì đối tượng truy vấn tìm kiếm của tôi là chuỗi. Tôi bỏ qua các giá trị Non-String cho bây giờ như là một workaround nhưng tôi tò mò nếu nó có thể tìm kiếm nó trong tất cả các lĩnh vực.

Ví dụ, nếu người dùng muốn tìm kiếm một mục tiêu là "Age" lĩnh vực của đối tượng giá trị số nguyên, tôi không thể làm cho nó làm việc theo cách này.

public <T extends RealmObject> List<T> searchDatabase(Class<T> clazz, String searchQuery) { 

    /* Begin Query */ 
    RealmQuery<T> query = realmDatabase.where(clazz).beginGroup(); 

    Field[] fields = clazz.getDeclaredFields(); 

    for (int i = 0; i < fields.length; i++) { 

     /* Skip NON-String Values */ 
     if (!fields[i].getType().equals(String.class)) { 
      continue; 
     } 

     if (i == 0) { 
      query.contains(fields[i].getName(), searchQuery, false); 
     } else { 
      query.or().contains(fields[i].getName(), searchQuery, false); 
     } 
    } 

    /* Return All Objects Found */ 
    return query.endGroup().findAll(); 
} 

Trả lời

8

Cơ đốc giáo từ Vương quốc ở đây. Lý do mã của bạn không hoạt động là vì chỉ làm việc cho các lĩnh vực String (http://realm.io/docs/java/api/io/realm/RealmQuery.html#contains-java.lang.String-java.lang.String-), vì vậy khi bạn cố gắng sử dụng nó với một trường số nguyên nó sẽ thất bại.

Nếu bạn muốn tìm kiếm cho kiểu dữ liệu khác nhau, bạn sẽ cần phải cast họ như vậy, một cái gì đó như:

public <T extends RealmObject> List<T> searchDatabase(Class<T> clazz, String searchQuery) { 

    RealmQuery<T> query = realmDatabase.where(clazz).beginGroup(); 

    Field[] fields = clazz.getDeclaredFields(); 

    for (int i = 0; i < fields.length; i++) { 
     Class<?> type = fields[i].getType(); 
     String fieldName = fields[i].getName(); 

     if (i > 0) { 
      query.or() 
     } 

     if (type.equals(String.class)) { 
      query.contains(fieldName, searchQuery) 
     } else if (type.equals(Integer.class)) { 
      query.equalTo(fieldName, Integer.parseInt(searchQuery)) 
     } else { 
      ... 
     } 
    } 

    /* Return All Objects Found */ 
    return query.endGroup().findAll(); 
} 
+0

Cảm ơn Christian, đó là những gì tôi đang làm bây giờ. Nhưng tôi nghĩ có thể có một cách để làm điều đó trong chính Realm. Các bạn có dự định có một loại phương thức truy vấn mà chúng tôi có thể truy vấn trong tất cả các trường không? một cái gì đó như 'query.containsAll (searchQuery)', bất kể tên trường. – osayilgan

+0

Chúng tôi không có bất kỳ kế hoạch vào lúc này, nhưng cảm thấy tự do để tạo ra một yêu cầu tính năng trên GitHub. Có dễ dàng hơn để thảo luận về trường hợp sử dụng chính xác và dễ dàng hơn để xem liệu những người khác có quan tâm đến chức năng đó không. –

0

Kiểm tra xem bạn có thể sử dụng mã này hay không. Bạn có thể bao gồm tất cả các nguyên thủy tôi nghĩ. Tôi đã thêm mã cho String, int và float.

import java.lang.reflect.Field; 

public class ReflectionTest { 
    String stringValue; 
    int intValue; 
    float floatValue; 

    public static void main(String[] args) { 
     Field[] fields = ReflectionTest.class.getDeclaredFields(); 

     for (Field field : fields) { 

      if (field.getType().toString().contains("int")) { 
       System.out.println("int Name \t" + field.getName()); 
      } 

      if (field.getType().toString().contains("float")) { 
       System.out.println("float Name \t" + field.getName()); 
      } 

      if (field.getType().toString().contains("String")) { 
       System.out.println("String Name \t" + field.getName()); 
      } 

     } 
    } 

} 
+0

gì mã này làm là, in ra các tên trường. Việc tìm kiếm loại trường đã được triển khai trong mã của tôi. Tôi bỏ qua các giá trị Non-String theo cách tương tự. Đọc lại câu hỏi và cho tôi biết nếu bạn không hiểu tôi đang hỏi gì. – osayilgan

+0

Xin lỗi, tôi đã nhận được câu hỏi. Nếu bạn có một loại chuỗi không nói Integer, Bạn có thể chuyển đổi số nguyên sang chuỗi (String.valueOf ([int/float/đôi/dài/char/bolean])) và sau đó sử dụng phương pháp chứa ?? –

+0

có, có thể. Nhưng vấn đề là tôi không biết liệu searchQuery có phải là số nguyên hoặc chuỗi hoặc hỗn hợp các loại khác nhau hay không. Phương pháp này cần phải là chung nhất có thể và phải làm việc với tất cả các loại dữ liệu. – osayilgan

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