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

osa*_*gan 6 java database android 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();
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ior 10

来自境界的基督徒在这里.您的代码不起作用的原因是因为contains()只能处理String字段(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();
}
Run Code Online (Sandbox Code Playgroud)