Android官方ORM資料庫Room技術解決方案簡介(一)

來源:互聯網
上載者:User

標籤:觀察   bsp   blog   ==   protected   csdn   ica   div   設定   

是時候該忘記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 

Android官方ORM資料庫Room技術解決方案簡介(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.