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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM