[Android]AndroidInject增加sqlite3数据库映射注解(ORM)
以下内容为原创,欢迎转载,转载请注明
来自天天博客: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:
/**
* Created with IntelliJ IDEA.
* Author: wangjie email:tiantian.china.2@gmail.com
* Date: 14-3-25
* Time: 上午10:04
*/
@AITable("user")
public class User implements Serializable{
@AIColumn
@AIPrimaryKey(insertable = false)
private int uid;
@AIColumn("username")
private String username;
@AIColumn
private String password;
@AIColumn
private long createmillis;
@AIColumn
private float height;
@AIColumn
private double weight; private String notCol;
// getter/setter...
}
如上面的代码所示:
@AITable 类注解,用于映射类到表, value()表示要映射到的表的名称,不填写或未增加该注解则默认以类名小写为表名
@AIPrimaryKey 属性注解,用于指定属性为主键,insertable()表示插入数据时是否同时也插入主键到表。默认为false,即表的主键应该为自动生成
@AIColumn 属性注解,用于映射属性到表字段,value()表示要映射到的表字段名称,不填写则默认以属性名作为表字段名
这样,类和表之间就用以上的几个注解进行了映射。
三. AndroidInject提供了一个AIDbExecutor抽象类来对表数据进行操作,使用时需要自己编写一个DbExecutor来继承AIDbExecutor,并实现obtainDbHelper()方法,用于提供给DbExecutor一个AIDatabaseHelper。如下:
public class DbExecutor<T> extends AIDbExecutor<T>{
private final static String TAG = DbExecutor.class.getSimpleName();
public final static String DB_NAME = "androidinject_db";
public final static int VERSION = 1;
public DbExecutor(Context context) {
super(context);
}
@Override
public AIDatabaseHelper obtainDbHelper() {
return new DatabaseHelper(context, DB_NAME, VERSION);
}
}
接下来就可以直接使用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]AndroidInject增加sqlite3数据库映射注解(ORM)的更多相关文章
- Android大学课件SQLite3 数据库操作
一.数据库介绍 SQLite3:当有大量相似结构的数据需要存储的时候 . 其实SQLite3 就是一个文件,类似之前学过的MySQL SqlServer等. 二.SQLiteOpenHelper 是一 ...
- Android目前流行三方数据库ORM分析及对比
Android 平台上的数据库框架非常多,但是有一个共同特点就是基于对象关系映射(ORM)模型的.实现的目标也都是不需要写SQL语句,通过对对象的操作保存和操作数据.要是从语法的简洁性来说都有自己的特 ...
- 【Android】Android连接SQLite3数据库的操作
在前面使用SQLite3的时候,并没有留意到有SQLiteOpenHelper这个类,所以只好在Activity里面去创建和维护数据库跟数据表的创建. 但是,现在有了SQLiteOpenHelper这 ...
- Android开发数据库之第三方ORM框架(GreenDao)
移动APP追求追求功能实现的同一时候,用户体验很重要.開始APP的同一时候.要时刻的切换开发人员的角色,如你开发的时候.是 站在APP的开发角色,处于生产者的位置:当你測试的时候.你应该把自己放在用户 ...
- 安卓使用SQlite3数据库无法id主键无法自动增加?不是的。
安卓使用SQlite3数据库无法id主键无法自动增加?不是的. 要这样写:id integer primary key ,要写integer而不是int所以会报错! http://blog.csdn. ...
- Android 系统API实现数据库的增删改查和SQLite3工具的使用
在<Android SQL语句实现数据库的增删改查>中介绍了使用sql语句来实现数据库的增删改查操作,本文介绍Android 系统API实现数据库的增删改查和SQLite3工具的使用. 系 ...
- Cocos移植到Android的一些问题-SQLite3数据库移植问题
首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一 ...
- Android adb使用sqlite3对一个数据库进行sql查询
sqlite是Android下集成的一个轻量级数据库,我们可以通过adb程序进入数据库命令行,对数据进行查询,具体操作如下: ①打开windows的cmd ②输入adb shell.此时进入了该安卓系 ...
- 在cmd窗口中查询android的sqlite3数据库表之步骤
本文主要是写了一个android程序对sqlite3中数据库的employee表的插入.删除的操作,然后在cmd窗口中用sql命令查询employee表的操作过程. 1.第一步:首先把程序写好. 1. ...
随机推荐
- 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
一.首先是下载Java JDK 到目前为止的最新版本为(jdk1.8.0_60),有两种方式进行下载: 1.使用shell来进行下载,可使用如下命令直接进行下载: wget --no-check-ce ...
- Jquery基本用法总结
选择器$("#mydiv") 通过ID$("p#myp") 选择id=myp 的所有p元素(组合型)$(".mydiv") 通过 class ...
- Azure PowerShell (1) PowerShell整理
<Windows Azure Platform 系列文章目录> 把之前Azure ASM的PowerShell都整理好了. https://github.com/leizhang1984/ ...
- UMeditor宽度自适应
百度编辑器UMeditor,生成富文本编辑框以后,改变窗口大小会出现横向滚动条,即使你调用接口设置了编辑器的宽度为100%.如: var um = UM.getEditor('<%=txtCon ...
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- javascript必知必会:面象对象编程
面象对象编程技术的核心理念:封装.继承.多态:在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接 ...
- CSS魔法堂:说说Float那个被埋没的志向
前言 定位系统中第一难理解就是Normal flow,而第二就非Float莫属了,而Float难理解的原因有俩,1. 一开头我们就用错了:2. 它跟Normal flow靠得太近了.本文尝试理清Fl ...
- js正则中的贪婪和非贪婪模式问题总结
var b="abeeee:eeeee:eeeeeab"; console.log(b.match(/e+\:e+/g));//["eeee:eeeee"]贪婪 ...
- 【Win10】在应用中使用 SQLite 数据库
在绝大多数应用中,免不了要做的一项就是设置这样的本地数据存储.简单的数据存储我们可以使用 LocalSettings 或者 IsolatedStorageFile(独立存储)等等的方式来进行本地数据存 ...
- JS打印页面指定区域
错误的写法: //打印 function printPage(areaId) { if (parent.$("#PrinFrame").length == 0) { parent. ...