博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]AndroidInject增加sqlite3数据库映射注解(ORM)
阅读量:6886 次
发布时间:2019-06-27

本文共 4247 字,大约阅读时间需要 14 分钟。

以下内容为原创,欢迎转载,转载请注明

来自天天博客:

AndroidInject项目是我写的一个使用注解注入来简化代码的开源项目

今天新增功能如下:

1. 增加对sqlite3数据库的orm注解支持,增加@AIColumn、@AIPrimaryKey、@AITable三个注解来映射到表(有待改进)

2. 使用反射来封装AIDbExecutor类,实现半自动化orm,类似mybatis

  先说说使用的方式吧

  一. 新建DatabaseHelper,继承AIDatabaseHelper(AndroidInject提供,直接继承了SQLiteOpenHelper),在onCreate中调用如下方法来新建表user:

@Overridepublic 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     @AIColumn10     @AIPrimaryKey(insertable = false)11     private int uid;12     @AIColumn("username")13     private String username;14     @AIColumn15     private String password;16     @AIColumn17     private long createmillis;18     @AIColumn19     private float height;20     @AIColumn21     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
extends AIDbExecutor
{ 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 @Override11 public AIDatabaseHelper obtainDbHelper() {12 return new DatabaseHelper(context, DB_NAME, VERSION);13 }14 15 16 }

   接下来就可以直接使用AIDbExecutor来进行数据库的操作了,如下:

// 创建一个用于操作user表的dbExecutor对象AIDbExecutor
userExecutor = new DbExecutor
(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
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();

 

本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/3623050.html
,如需转载请自行联系原作者
你可能感兴趣的文章
调试时显示数据防止乱码
查看>>
logback 日志输出级别设置
查看>>
直接插入法
查看>>
用户管理 新老用户的管理
查看>>
linux时间同步命令
查看>>
书法家程序员往往是公司最不受欢迎的程序员
查看>>
关于文件操作集锦 delphi
查看>>
mysqldump备份还原和mysqldump导入导出语句大全详解 转
查看>>
WAMP 隐藏服务器信息
查看>>
【APP打开小程序】
查看>>
CentOS7.1配置Ceph集群环境
查看>>
Ceph常用命令
查看>>
Spring MVC3 一对多的复杂表单和一次保存方法
查看>>
R.java檔重建
查看>>
Java注解Annotation详解
查看>>
ejb事务
查看>>
node环境搭建
查看>>
Speed ScrollView
查看>>
BJImageCropper
查看>>
android handler总结
查看>>