ORMLite其中String Array中的clausule

时间:2012-06-04 11:12:07

标签: android arrays where-clause ormlite

我使用ormlite,我有一个带字段的数据库:

public static final String NAME = "name"; 
@DatabaseField (canBeNull = false, dataType = DataType.SERIALIZABLE, columnName = NAME)
private String[] name = new String[2];

我想得到名称[0]和名称[1]的所有元素都是“汽车”。我尝试添加一个where clausule,如:

NAMEDB nameDB = null;
Dao<NAMEDB, Integer> daoName = this.getHelper().getDao(NAMEDB.class);
QueryBuilder<NAMEDB, Integer> queryName = daoName.queryBuilder();
Where<NAMEDB, Integer> where = queryName.where();
where.in(nameDb.NAME, "car");

但它不起作用,因为它是一个数组字符串。

我还有其他领域:

public static final String MARK = "mark";

@DatabaseField (canBeNull = false, foreign = true, index = true, columnName = MARK)
private String mark = null;

我可以这样做:

whereArticulo.in(nameDB.MARK, "aaa");

如何解决我的问题?感谢。

3 个答案:

答案 0 :(得分:4)

在我看来,使用String[] someStringArray[]在数据库中存储字符串数组(Ormlite)的第三个选项是定义一个数据持久化类,它将字符串数组转换为单个分隔的字符串存储到数据库中,并在将其从数据库中取出后再返回到字符串数组。

例如,persister类会将["John Doe", "Joe Smith"]转换为"John Doe | Joe Smith"以进行数据库存储(使用对数据有意义的任何分隔符),并在将数据从数据库中取出时转换回来。 / p>

有关此方法与使用Serializable或外国集合的任何想法?有人试过吗?

我刚刚写了第一个persister类,这很简单。我无法通过网络搜索或StackOverflow搜索确定是否有人尝试过此操作。

感谢。

答案 1 :(得分:2)

正如ronbo4610建议的那样,在这种情况下使用自定义数据持久性是一个好主意,将数组作为字符串存储在由某种分隔符分隔的数据库中。然后,您可以像查看任何其他字符串一样搜索WHERE子句中的字符串。 (例如,使用LIKE运算符)

我已经实现了这样的数据持久化。要使用它,必须在持久化类的String []对象上方添加以下注释:

@DatabaseField(persisterClass = ArrayPersister.class)

此外,您必须创建一个名为&#34; ArrayPersister&#34;的新类。使用以下代码:

import com.j256.ormlite.field.FieldType;
import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.field.types.StringType;
import org.apache.commons.lang3.StringUtils;

public class ArrayPersister extends StringType {
    private static final String delimiter = ",";
    private static final ArrayPersister singleTon = new ArrayPersister();

    private ArrayPersister() {
        super(SqlType.STRING, new Class<?>[]{ String[].class });
    }

    public static ArrayPersister getSingleton() {
        return singleTon;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
        String[] array = (String[]) javaObject;

        if (array == null) {
            return null;
        }
        else {
            return StringUtils.join(array, delimiter);
        }
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
        String string = (String)sqlArg;

        if (string == null) {
            return null;
        }
        else {
            return string.split(delimiter);
        }
    }
}

答案 2 :(得分:1)

不幸的是ORMLite 支持查询SERIALIZABLE类型的字段。它将数组存储为序列化byte[],因此您无法使用IN查询来查询值:

where.in(nameDb.NAME, "car");

ORMLite确实支持外国集合,但你必须自己设置另一个包含名称的类。请参阅带有示例代码的文档:

  

http://ormlite.com/docs/foreign-collection