我想将某些类型为ParentClass的字段作为json字符串存储到我的数据库中。我不想使用Serializable接口和DataType.SERIALIZABLE导致它与序列化类的完整类名相关联。
所以我正在使用以下代码:
class ParentClass { @DatabaseField(persisterClass = MyFieldClassPersister.class) private MyFieldClass myField; }
持久性类的一种:
public class MyFieldClassPersister extends StringType { private static final MyFieldClassPersister singleTon = new MyFieldClassPersister(); public static MyFieldClassPersister getSingleton() { return singleTon; } protected MyFieldClassPersister() { super(SqlType.STRING, new Class<?>[0]); } @Override public Object parseDefaultString(FieldType fieldType, String defaultStr) { return jsonStringToObject(defaultStr); } @Override public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException { String string = results.getString(columnPos); return jsonStringToObject(string); } private static MyFieldClass jsonStringToObject(String string) { // json to object conversion logic } }
这是我遇到的两个问题:
我没有得到如何指定从对象到字符串的自定义转换的信息。似乎ORMLite调用Object.toString()以获得对象的字符串表示形式。在Persister中有一些方法非常好,我可以在其中指定如何将Object转换为字符串(在我的情况下为json)。是的,我可以在MyFieldClass中重写toString()方法,但是在Persister中执行转换更为方便。为了指定从模型对象到db-object的转换,我可以重写任何方法吗?
如果我将自定义字段类型标记为String类型:
class ParentClass { @DatabaseField(dataType = DataType.STRING, persisterClass = MyFieldClassPersister.class) private MyFieldClass myField;
}
然后使用以下消息保存对象时ormlite崩溃:
java.lang.IllegalArgumentException: Field class com.myapp.venue.MyFieldClass for field FieldType:name=myField,class=ParentClass is not valid for type com.j256.ormlite.field.types.StringType@272ed83b, maybe should be class java.lang.String
如果我省略dataType规范,它不会崩溃。我可以以某种方式避免这种崩溃吗?在我看来,最好明确地指定类型。
因此,基本上,您的持久化器应以以下方式实现:
public class MyFieldClassPersister extends StringType { private static final MyFieldClassPersister INSTANCE = new MyFieldClassPersister(); private MyFieldClassPersister() { super(SqlType.STRING, new Class<?>[] { MyFieldClass.class }); } public static MyFieldClassPersister getSingleton() { return INSTANCE; } @Override public Object javaToSqlArg(FieldType fieldType, Object javaObject) { MyFieldClass myFieldClass = (MyFieldClass) javaObject; return myFieldClass != null ? getJsonFromMyFieldClass(myFieldClass) : null; } @Override public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) { return sqlArg != null ? getMyFieldClassFromJson((String) sqlArg) : null; } private String getJsonFromMyFieldClass(MyFieldClass myFieldClass) { // logic here } private MyFieldClass getMyFieldClassFromJson(String json) { // logic here } }
您应该在onCreate您的OrmLiteSqliteOpenHelper课堂方法中注册它
onCreate
OrmLiteSqliteOpenHelper
@Override public void onCreate(SQLiteDatabaseHolder holder, ConnectionSource connectionSource) { try { //... DataPersisterManager .registerDataPersisters(MyFieldClassPersister.getSingleton()); } catch (SQLException e) { // log exception } }
然后可以在模型中使用它,如下所示:
@DatabaseField(persisterClass = MyFieldClassPersister.class, columnName = "column_name") protected MyFieldClass myFieldClass;