Android官方ORM数据库Room技术解决方案简介(一)

来源:互联网 发布:关于网络婚恋案例 编辑:程序博客网 时间:2024/05/16 05:00
是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一)

Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案。Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有诸多相同的设计思想和理念,但Android Room同时吸收众家ORM数据库之长,有自己新的创新和改进。我将分开写若干篇文章,逐点介绍Android官方的ORM数据库技术解决方案:Room。
(一)使用Android Room,首先要在gradle添加引用,我是基于room的version 1.0.0:
    implementation 'android.arch.persistence.room:runtime:1.0.0'    annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'


(二)和其他ORM数据库相似,Android Room需要先建立数据库表和Java对象的模型,User.java:
package zhangphil.demo;import android.arch.persistence.room.ColumnInfo;import android.arch.persistence.room.Entity;import android.arch.persistence.room.PrimaryKey;/** * Created by Phil on 2017/11/22. */@Entity(tableName = "user_table")public class User {    @PrimaryKey(autoGenerate = true)    public int id;    @ColumnInfo(name = "userName")    public String name;    @ColumnInfo(name = "userAge")    public int age;    @ColumnInfo(name = "updateTime")    public long updateTime;}

注解@Entity告诉Android Room,该User类将是一个数据库中的表。tableName如果开发者不自定义,那么Android系统默认将使用类名作为数据库中的表名。本例中的User,指定了表名为“user_table”,开发者可以根据自己情况自命名。

@PrimaryKey标注该字段是表中的主键,可根据该主键进行数据库的基本增删改查等等这些操作。当设置autoGenerate = true后,该主键将自增长。@ColumnInfo注解后面跟着的name,标明定义的Java变量将作为表中的一列。比如User中的

    @ColumnInfo(name = "userName")    public String name;
那么数据库中表的一列userName中存储的数据就是name。


(三)构建针对User的Dao。UserDao.java:
package zhangphil.demo;import android.arch.persistence.room.Dao;import android.arch.persistence.room.Delete;import android.arch.persistence.room.Insert;import android.arch.persistence.room.OnConflictStrategy;import android.arch.persistence.room.Query;import android.arch.persistence.room.Update;import java.util.List;/** * Created by Phil on 2017/11/22. */@Daopublic interface UserDao {    /**     * 查询     *     * @return     */    @Query("SELECT * FROM user_table")    public List<User> getAllUsers();    /**     * 添加     *     * @param users     */    @Insert(onConflict = OnConflictStrategy.REPLACE)    public void insertUser(User... users);    /**     * 更新     *     * @param users     */    @Update    public void updateUser(User... users);    /**     * 删除     *     * @param users     */    @Delete    public void deleteUser(User... users);}

@Dao注解标明该Java类是一个Android Room中的Dao对象。Android Room中的Dao,可以以接口interface形式定义。Android Room中的查询以SQL标准语句定义。比如在UserDao中的定义的:

    /**     * 查询     *     * @return     */    @Query("SELECT * FROM user_table")    public List<User> getAllUsers();

该SQL语句将从我之前建立的数据块表“user_table”中,查询出所有的内容,然后返回一个集合。其他关于数据库的操作如增加(@Insert),删除(@Delete),修改(更新,@Update),均以注解标明。这些基本操作可以按照User中定义的@PrimaryKey主键操作。

(四)构造数据库。
这一步在Android Room技术中基本上是规范化的代码,写法比较规矩,建立UserDatabase.java:
package zhangphil.demo;import android.arch.persistence.room.Database;import android.arch.persistence.room.RoomDatabase;/** * Created by Phil on 2017/11/22. */@Database(entities = {User.class}, version = 1)public abstract  class UserDatabase  extends RoomDatabase {    public abstract UserDao getUserDao();}
UserDatabase最重要的功能是提供给开发者各种Dao。开发者获得Dao后,就可以像操作基本Java对象实例一样操作Android Room数据中数据。
最终的代码结构如图:



(五)在MainActivity.java中测试我写的Android Room。注意涉及到数据库操作,要放到后台线程中运行。MainActivity.java:

package zhangphil.demo;import android.arch.persistence.room.Room;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import java.util.List;public class MainActivity extends AppCompatActivity {    private String TAG = "输出";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        new Thread(new Runnable() {            @Override            public void run() {                databaseOperation();            }        }).start();    }    private void databaseOperation() {        UserDatabase mUserDatabase = Room.databaseBuilder(getApplicationContext(), UserDatabase.class, "users").build();        UserDao mUserDao = mUserDatabase.getUserDao();        //写数据库        Log.d(TAG, "开始写入数据...");        writeDatabase(mUserDao, "张三", 18);        writeDatabase(mUserDao, "李四", 19);        Log.d(TAG, "写入数据库完毕.");        //读数据库        Log.d(TAG, "第1次读数据库");        readDatabase(mUserDao);        //更新数据库        updateUser(mUserDao);        //读数据库        Log.d(TAG, "第2次读数据库");        readDatabase(mUserDao);        //删除数据,根据主键id        deleteUser(mUserDao, 1);        //读数据库        Log.d(TAG, "第3次读数据库");        readDatabase(mUserDao);        Log.d(TAG, "========================");        Log.d(TAG, "本轮数据库操作事务全部结束");        Log.d(TAG, "========================");    }    private void readDatabase(UserDao dao) {        Log.d(TAG, "读数据库...");        List<User> users = dao.getAllUsers();        for (User u : users) {            Log.d(TAG, u.id + "," + u.name + "," + u.age + "," + u.updateTime);        }        Log.d(TAG, "读数据库完毕.");    }    private void writeDatabase(UserDao dao, String name, int age) {        User user = new User();        user.name = name;        user.age = age;        user.updateTime = System.currentTimeMillis();        dao.insertUser(user);    }    private void updateUser(UserDao dao) {        Log.d(TAG, "更新数据库...");        User u = new User();        u.id = 2;        u.name = "赵五";        u.age = 20;        u.updateTime = System.currentTimeMillis();        dao.updateUser(u);        Log.d(TAG, "更新数据库完毕.");    }    private void deleteUser(UserDao dao, int id) {        Log.d(TAG, "删除数据库...");        User u = new User();        u.id = id;        dao.deleteUser(u);        Log.d(TAG, "删除数据库完毕.");    }}

MainActivity.java实现基本的功能,在数据库中添加写入两条数据条目。然后在第一次读数据库操作中,从数据中读出来观察是否已经写进去。
接着更新数据库,根据User的PrimaryKey主键id更新,我把数据库中主键id为2的数据行更新。再次第2次读数据库,验证我的更新操作是否成功。
然后再根据主键删除id=1的数据库数据行,第3次读数据库,验证数据库删除的操作。代码运行后的logcat输出:
11-23 10:49:22.631 19616-19641/zhangphil.demo D/输出: 开始写入数据...11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 写入数据库完毕.11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 第1次读数据库11-23 10:49:22.688 19616-19641/zhangphil.demo D/输出: 读数据库...11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 1,张三,18,151140536263111-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 2,李四,19,151140536267411-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 读数据库完毕.11-23 10:49:22.689 19616-19641/zhangphil.demo D/输出: 更新数据库...11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 更新数据库完毕.11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 第2次读数据库11-23 10:49:22.692 19616-19641/zhangphil.demo D/输出: 读数据库...11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 1,张三,18,151140536263111-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 2,赵五,20,151140536268911-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 读数据库完毕.11-23 10:49:22.693 19616-19641/zhangphil.demo D/输出: 删除数据库...11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 删除数据库完毕.11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 第3次读数据库11-23 10:49:22.696 19616-19641/zhangphil.demo D/输出: 读数据库...11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 2,赵五,20,151140536268911-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 读数据库完毕.11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: ========================11-23 10:49:22.698 19616-19641/zhangphil.demo D/输出: 本轮数据库操作事务全部结束11-23 10:49:22.699 19616-19641/zhangphil.demo D/输出: ========================


附录:
1,《Android ORMLite数据库简介》链接:http://blog.csdn.net/zhangphil/article/details/46878075 
2,《Android ORMLite ForeignCollection关联外部集合》链接:http://blog.csdn.net/zhangphil/article/details/46891021 
原创粉丝点击