[Android]AndroidInject增加sqlite3数据库映射注解(ORM)

简介: 以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3623050.html AndroidInject项目是我写的一个使用注解注入来简化代码的开源项目 https://github.

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

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3623050.html

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();

 

相关文章
|
存储 安全 Android开发
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
374 0
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(二)
|
存储 Android开发 数据格式
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)
279 0
【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )(一)
|
XML 安全 Java
【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
545 0
【Android 安装包优化】资源混淆 ( AAPT2 资源编译工具 | resources.arsc 资源映射表 工作机制 )
|
Android开发
【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 )
【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 )
474 0
【Android 安装包优化】资源打包配置 ( resources.arsc 资源映射表 | 配置国际化资源 )
|
Java Android开发
【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符
原文:【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符 1、问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责Lint代码静态检查工作。
1451 0
|
Java Android开发
【我的Android进阶之旅】解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符
1、问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责Lint代码静态检查工作。因此编写了自定义的Lint规则,在调试过程中,编译的时候出现了如下所示的错误: 部分输出日志如下所示: :XTCLintrRules:compileJa...
1923 0
|
KVM Android开发 虚拟化
android qemu-kvm内存管理和IO映射
为什么内存管理和IO映射要放一起呢?因为IO映射有memory map io(MMIO)和port map io(PMIO)两种,其中MMIO和内存管理有关的。 MMIO和普通内存的访问的汇编指令是相同的;PMIO有自己的汇编指令。
2211 0
|
Android开发
Android中修改键盘布局或者按键映射时的注意点
在Android中修改键盘布局或者按键映射时,除了在inputdevice中修改上报的SCANCODE之外,还需要修改相应的kl文件。 具体原理: 当一个inputdevice的driver将按键的SCANCODE上报给EventHub之后,EventHub还会用SCANCODE去获取具体的Keycode,这一步就是根据相应的inputdevice的kl文件中的配置得到的,所以如果仅仅上报SCANCODE,不修改kl文件,则会导致SCANCODE是正确的,但是找不到相应的mapkey,从而上报的最终keycode是UNKNOWN。
1283 0
|
17天前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
43 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡