English | 中文
这个项目是一个简单的Android
SQLite读取工具,将数据库中的数据反序列生成对象集。
使用 Java ResultSet 可以查看 SQLDataSet
implementation 'io.github.yeamy:sqlitedataset:1.2'
public class Fruit {
@DsColumn("Name")
public String name; // 声明此参数对应列名为Name
public String fullName; // 列名可以是 "fullName" 或者 "full_name"
@DsIgnore
public String count; // 声明此参数不读取
public FruitType type; // 不添加此声明,取参数名做列名,此参数为自定义类型(见下文 DsAdapter)
public Skin skin; // 没有声明DsColumn的参数当做扩展参数处理
}
一般情况使用DsReader工具类快速读取已足矣
Statement stmt = ...; // 数据源
String sql = "SELECT ..."; // 筛选的SQL语句
Fruit apple = DsReader.read(stmt, sql, Fruit.class);
ArrayList<Fruit> list = r DsReader.readArray(stmt, sql, Fruit.class);
使用自定义工厂类生产对象,并注册DsAdapter来扩展自定义类型。
java.sql.ResultSet rs = ...; // 数据来源
DsFactory<Fruit> factory = new DsFactory(Fruit.class); // 实例化工厂
DsAdapter adapter = new DsAdapter() {
/**
* @param t
* 基础类型的成员变量已读取,可以直接使用
* @param field
* 对应需要读取的参数,使用field.getName()区分
* @param rs
* 数据库搜索结果
* @param columnIndex
* 对应参数在rs中对应的位置
*/
@Override
public void read(Object t, Field field, ResultSet rs, int columnIndex) throws SQLException, InstantiationException, IllegalAccessException {
FruitType type = new FruitType(....);
field.set(t, type);
}
};
factory.addAdapter(Type.class, adapter); // 添加自定义类型
Fruit apple = factory.read(rs); // 读取单个
factory.readArray(list, rs); // 读取多个
List<Fruit> list = new ArrayList<Fruit>();
factory.readArray(list, rs); // 自定义list
如果导入DsObserver接口,解析结束后会调用onDsFinish()方法,可以在此方法修改数据。
public class Vegetables implements DsObserver {
@DsColumn("Name")
public String name;
...
@Override
public void onDsFinish(){}
}
来自ResultSet的同一行数据可以被解析到同一实例内。
数据表:
UserName | Province | CityName | ... |
---|---|---|---|
Nike | Guangdong | Shantou | ... |
... |
通常会采用如下数据类:
public class User {
@DsColumn("UserName")
public String name;
@DsColumn("Province")
public String province;
@DsColumn("CityName")
public String city;
...
}
为了将province和city封装到同个参数内,可以使用如下方式:
public class User {
@DsColumn("UserName")
public String name;
...
// 注意:参数不能声明DsColumn,参数名不能与列名重复,
// 否则只能使用DsAdapter来解析
public City location;
}
public class City {
@DsColumn("Province")
public String province;
@DsColumn("CityName")
public String city;
...
}