我使用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");
如何解决我的问题?感谢。
答案 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确实支持外国集合,但你必须自己设置另一个包含名称的类。请参阅带有示例代码的文档: