在DbUtils中,只支持4中数据类型:
而在Java中,我们有8种基本类型,但是我们在使用DbUtils时,都能正确的对这些数据类型进行存取,
这是怎么做到的呢?
为了保存这个数据类型,作者在保存数据之前,实现了一个ColumnConverter:
在程序开始的时候,通过ColumnConverterFactory对HttpHandlerStateConverter进行注册:
这样,DbUtils就能自动帮助我们存取自定义类型数据了.
public enum ColumnDbType {
INTEGER("INTEGER"), REAL("REAL"), TEXT("TEXT"), BLOB("BLOB");
private String value;
ColumnDbType(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
而在Java中,我们有8种基本类型,但是我们在使用DbUtils时,都能正确的对这些数据类型进行存取,
这是怎么做到的呢?
通过查看源码发现,com.lidroid.xutils.db.converter包中,定义了一系列的转换器,
这些转换器都实现了ColumnConverter接口,然后在ColumnConverterFactory中对这些装换器进行注册,
这样,DbUtils就知道怎么自动存取这些数据类型了.
所以,如果想DbUtils能保存我们自定义的数据类型,仿照已经实现的转换器即可.
下面是xUtils官方的例子:
当程序退出是,需要保存正在下载文件的数据,其中有一个下载状态,是自定义的枚举类型,
public enum State {
WAITING(0), STARTED(1), LOADING(2), FAILURE(3), CANCELLED(4), SUCCESS(5);
private int value = 0;
State(int value) {
this.value = value;
}
public static State valueOf(int value) {
switch (value) {
case 0:
return WAITING;
case 1:
return STARTED;
case 2:
return LOADING;
case 3:
return FAILURE;
case 4:
return CANCELLED;
case 5:
return SUCCESS;
default:
return FAILURE;
}
}
public int value() {
return this.value;
}
}
为了保存这个数据类型,作者在保存数据之前,实现了一个ColumnConverter:
private class HttpHandlerStateConverter implements ColumnConverter<HttpHandler.State> {
@Override
public HttpHandler.State getFieldValue(Cursor cursor, int index) {
return HttpHandler.State.valueOf(cursor.getInt(index));
}
@Override
public HttpHandler.State getFieldValue(String fieldStringValue) {
if (fieldStringValue == null) return null;
return HttpHandler.State.valueOf(fieldStringValue);
}
@Override
public Object fieldValue2ColumnValue(HttpHandler.State fieldValue) {
return fieldValue.value();
}
@Override
public ColumnDbType getColumnDbType() {
return ColumnDbType.INTEGER;
}
}
在程序开始的时候,通过ColumnConverterFactory对HttpHandlerStateConverter进行注册:
ColumnConverterFactory.registerColumnConverter(HttpHandler.State.class, new HttpHandlerStateConverter());
这样,DbUtils就能自动帮助我们存取自定义类型数据了.