我在Realm数据库中持有一组不同类型的对象。现在我想查询某些类型的对象,包括该对象的所有字段。我在下面编写的方法是获取Object的所有声明字段并在字段上迭代以检查是否包含给定的查询字符串。
它适用于String字段类型,但是对于整数值会抛出java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER.
,因为我的搜索查询对象是字符串。我暂时跳过非字符串值作为解决方法,但我很好奇是否可以在所有字段中搜索它。
例如,如果用户想要搜索定位"年龄"的整数值。对象的领域,我不能让它以这种方式工作。
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();
}
答案 0 :(得分:9)
来自境界的克里斯蒂安。您的代码无法工作的原因是因为contains()
仅适用于字符串字段(http://realm.io/docs/java/api/io/realm/RealmQuery.html#contains-java.lang.String-java.lang.String-),因此当您尝试将contains()
与整数字段一起使用时,它将失败。
如果要搜索不同的数据类型,则需要将它们转换为类似数据类型,例如:
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();
}
答案 1 :(得分:0)
检查您是否可以使用此代码。你可以涵盖我认为的所有原语。我添加了String,int和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());
}
}
}
}