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

Query In Realm Database : Find All Objects Containing Query String

我在 Realm 数据库中保存了一组不同类型的对象。现在我想查询某种类型的对象,包括该对象的所有字段。我在下面写的方法是获取对象的所有声明字段并迭代这些字段以检查是否包含给定的查询字符串。

它适用于字符串字段类型,但对于整数值会抛出 java.lang.IllegalArgumentException: Field 'documentCompletionStatus': type mismatch. Was STRING, expected INTEGER.,因为我的搜索查询对象是字符串。作为解决方法,我暂时跳过非字符串值,但我很好奇是否可以在所有字段中搜索它。

例如,如果用户想要搜索针对对象的 "Age" 字段的整数值,我无法使其以这种方式工作。

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

检查您是否可以使用此代码。您可以涵盖我认为的所有原语。我已经为 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());
            }

        }
    }

}

这里是 Realm 的基督徒。您的代码不起作用的原因是 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();
}