zoukankan      html  css  js  c++  java
  • [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:

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

  • 相关阅读:
    存储函数
    Laravel的请求声明周期
    哪只猴子可以当大王
    有多少苹果用来分赃
    SqlDataAdapter使用小结
    主键与外键
    SQL server 操作相关
    C# 窗体相关知识
    C#中winform DataGridView常用修改点
    maven 坐标获取方式
  • 原文地址:https://www.cnblogs.com/tiantianbyconan/p/3623050.html
Copyright © 2011-2022 走看看