在领域数据库中查询:查找包含查询字符串的所有对象

时间:2015-04-22 04:23:56

标签: java android database realm

我在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();
}

2 个答案:

答案 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());
            }

        }
    }

}