[Android]AndroidInject增加sqlite3数据库映射注解(ORM)
AndroidInject项目是我写的一个使用注解注入来简化代码的开源项目
https://github.com/wangjiegulu/androidInject
今天新增功能如下:
1. 增加对sqlite3数据库的orm注解支持,增加@AIColumn、@AIPrimaryKey、@AITable三个注解来映射到表(有待改进)
2. 使用反射来封装AIDbExecutor类,实现半自动化orm,类似mybatis
先说说使用的方式吧
一. 新建DatabaseHelper,继承AIDatabaseHelper(AndroidInject提供,直接继承了SQLiteOpenHelper),在onCreate中调用如下方法来新建表user:
@Override
public void onCreate(SQLiteDatabase db) {
AIDbUtil.createTableIfNotExist(db,
“create table user(uid INTEGER PRIMARY KEY AUTOINCREMENT, “ +
“username varchar(20), “ +
“password varchar(20), “ +
“createmillis long, “ +
“height float, “ +
“weight double)”,
“user”);
}
其中方法createTableIfNotExist (SQLiteDatabase db, String sql, String tableName) 用于新建表,如果存在该表,则不创建
二. 既然是ORM,不管怎么样,总要在表与持久层对象之间映射,所以新建表完毕之后,就要新建类User:
1 /*
2 Created with IntelliJ IDEA.
3 Author: wangjie email:tiantian.china.2@gmail.com
4 Date: 14-3-25
5 Time: 上午10:04
6 /
7 @AITable(“user”)
8 public class User implements Serializable{
9 @AIColumn
10 @AIPrimaryKey(insertable = false)
11 private int uid;
12 @AIColumn(“username”)
13 private String username;
14 @AIColumn
15 private String password;
16 @AIColumn
17 private long createmillis;
18 @AIColumn
19 private float height;
20 @AIColumn
21 private double weight;
22
23 private String notCol;
24 // getter/setter…
25 }
如上面的代码所示:
@AITable 类注解,用于映射类到表, value()表示要映射到的表的名称,不填写或未增加该注解则默认以类名小写为表名
@AIPrimaryKey 属性注解,用于指定属性为主键,insertable()表示插入数据时是否同时也插入主键到表。默认为false,即表的主键应该为自动生成
@AIColumn 属性注解,用于映射属性到表字段,value()表示要映射到的表字段名称,不填写则默认以属性名作为表字段名
这样,类和表之间就用以上的几个注解进行了映射。
三. AndroidInject提供了一个AIDbExecutor抽象类来对表数据进行操作,使用时需要自己编写一个DbExecutor来继承AIDbExecutor,并实现obtainDbHelper()方法,用于提供给DbExecutor一个AIDatabaseHelper。如下:
1 public class DbExecutor<T> extends AIDbExecutor<T>{
2 private final static String TAG = DbExecutor.class.getSimpleName();
3 public final static String DB_NAME = “androidinject_db”;
4 public final static int VERSION = 1;
5
6 public DbExecutor(Context context) {
7 super(context);
8 }
9
10 @Override
11 public AIDatabaseHelper obtainDbHelper() {
12 return new DatabaseHelper(context, DB_NAME, VERSION);
13 }
14
15
16 }
接下来就可以直接使用AIDbExecutor来进行数据库的操作了,如下:
// 创建一个用于操作user表的dbExecutor对象
AIDbExecutor<User> userExecutor = new DbExecutor<User>(context);
// 插入一条user数据:
User dbUser = new User(“wangjie” + rd.nextInt(10000), String.valueOf(rd.nextInt(10000) + 10000), System.currentTimeMillis(), rd.nextInt(80) + 120, rd.nextInt(80) + 120, “aaaa”);
userExecutor.executeSave(dbUser);
// 查询user表
List<User> users = userExecutor.executeQuery(“select * from user where uid > ?”, new String[]{“4”}, User.class);
// 删除user表中的一条数据
userExecutor.executeDelete(users.get(0));
// 更新user表中的一条数据
User user = users.get(0);
user.setUsername(user.getUsername().startsWith(“wangjie”) ? “jiewang” + rd.nextInt(10000) : “wangjie” + rd.nextInt(10000));
user.setPassword(user.getPassword().startsWith(“123456”) ? “abcdef” : “123456”);
user.setCreatemillis(System.currentTimeMillis());
user.setHeight(rd.nextInt(80) + 120);
user.setWeight(rd.nextInt(80) + 120);
user.setNotCol(“bbb”);
userExecutor.executeUpdate(user, null, new String[]{“createmillis”});
四. AIDbExecutor类中提供的方法有:
1. public List<T> executeQuery(String sql, String[] selectionArgs, Class<?> clazz) throws Exception;
用于查询表,并自动封装到List<T>中,告别Cursor
2. public int executeSave(final T obj) throws Exception;
用于保存一条数据
3. public int executeUpdate(final T obj, final String[] includeParams, final String[] excludeParams) throws Exception;
用于更新一条数据,更新数据时,是根据主键去更新其他字段的。可以对其他要更新的字段进行包含和排除(填写类的属性)。
注意:包含在includeParams,并且不包含在excludeParams中才会被更新。
4. public int executeDelete(final T obj) throws Exception;
删除一条数据,根据主键删除一条数据
5. public void executeSql(String sql, Object[] selectionArgs) throws Exception;
执行一条sql语句(insert、update、delete)
6. 同时提供了生成SQLiteDatabase对象的方法
public SQLiteDatabase getReadableDatabase();
public SQLiteDatabase getWritableDatabase();
本文链接:https://blog.wangjiegulu.com/2014/03/25/Android-AndroidInject增加sqlite3数据库映射注解-ORM/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。