2

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

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

我想获取所有 name[0] 和 name[1] 是“汽车”的元素。我尝试添加一个 where 子句,例如:

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");

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

4

3 回答 3

4

在我看来,String[] someStringArray[]在数据库中Ormlite存储字符串数组(将其从数据库中取出。

例如,持久化类将转换["John Doe", "Joe Smith"]"John Doe | Joe Smith"用于数据库存储(使用对您的数据有意义的任何分隔符),并在将数据从数据库中取出时转换回另一种方式。

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

我刚刚写了我的第一个持久化类,这很容易。我无法通过网络搜索或 StackOverflow 搜索确定是否有人尝试过此操作。

谢谢。

于 2013-02-14T14:06:58.503 回答
2

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

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

@DatabaseField(persisterClass = ArrayPersister.class)

此外,您必须使用以下代码创建一个名为“ArrayPersister”的新类:

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);
        }
    }
}
于 2013-09-07T18:17:03.337 回答
1

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

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

ORMLite 确实支持外部集合,但您必须使用另一个保存名称的类自己设置它。请参阅带有示例代码的文档:

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

于 2012-06-04T14:08:41.623 回答