Room database

1端铛,三角色
(1)表:定義一個(gè)類,加上注解@Entity努酸,類里需要定義主鍵,使用@PrimaryKey標(biāo)識(shí)杜恰,如果主鍵自動(dòng)產(chǎn)生增長(zhǎng)获诈,需要加上(autoGenerate = true),其他變量根據(jù)自身業(yè)務(wù)定義心褐,下面例子定義了一個(gè)Student表類:

package com.mike.androidtips.database.room;

import androidx.room.Entity;
import androidx.room.PrimaryKey;

//表
@Entity
public class Student {
    @PrimaryKey (autoGenerate = true)
    private int id;

    int age;
    String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public Student() {

    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

(2)DAO: Database Access Object, 數(shù)據(jù)庫訪問對(duì)象類舔涎,作用是對(duì)數(shù)據(jù)庫中的表進(jìn)行增刪改查操作。在類上加@Dao注解逗爹。其他是操作類注解:@Insert亡嫌, @Update, @Delete掘而, @Query挟冠,@Query需要加SQL語句,具體看StudentDao類:

@Dao
public interface StudentDao {
    //增
    @Insert
    public void addStudents(Student...students);

    // 刪
    @Delete
    public void deleteStudents(Student...students);

    // 刪 全部
    @Query("DELETE FROM Student")
    public void deleteAllStudents();

    //改
    @Update
    public void updateStudents(Student...students);

    // 查
    @Query("SELECT * FROM Student ORDER BY ID DESC")
    public List<Student> getAllStudents();
}

(3) 數(shù)據(jù)庫類:和前面定義的表以及Dao關(guān)聯(lián)起來
- 數(shù)據(jù)庫定義成抽象類
- 數(shù)據(jù)庫類需添加注解@Database镣屹,里面定義版本號(hào)圃郊,以及通過entries關(guān)聯(lián)表
- 需要定義成單例模式
- 定義抽象方法价涝,獲取Dao女蜈,

@Database(entities = {Student.class}, version = 1, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {

    private static StudentDatabase INSTANCE;
    public static synchronized StudentDatabase getInstance(Context context) {

        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), StudentDatabase.class,
                    "student database")
                    //數(shù)據(jù)庫默認(rèn)是異步線程
                    //.allowMainThreadQueries() //強(qiáng)制開啟主線程也可以用數(shù)據(jù)庫 ,真實(shí)環(huán)境不要用
                    .build();
        }
        return INSTANCE;
    }

    public abstract StudentDao getStudentDao();

    @NonNull
    @Override
    protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
        return null;
    }

    @NonNull
    @Override
    protected InvalidationTracker createInvalidationTracker() {
        return null;
    }

    @Override
    public void clearAllTables() {

    }
}

  1. 數(shù)據(jù)庫的使用,封裝一個(gè)DBEngine伪窖,對(duì)外(User)提供增刪改查的API逸寓。
  • DBEngine在構(gòu)造中獲取Dao
  • 封裝多個(gè)AsyncTask操作數(shù)據(jù)庫,把Dao傳值進(jìn)去
  • API里調(diào)用AsyncTask的execute方法
public class DBEngine {
    private StudentDao studentDao;
    private String TAG = "DBEngine";
    public DBEngine(Context context) {
        StudentDatabase database = StudentDatabase.getInstance(context);
        studentDao = database.getStudentDao();
    }

    //插入
    public void addStudents(Student...students) {
        new AddAsyncTask(studentDao).execute(students);
    }

    //更新
    public void updateStudents(Student...students) {
        new UpdateAsyncTask(studentDao).execute(students);
    }

    //刪除單個(gè)
    public void deleteStudents(Student...students) {
        Log.d(TAG, "enter deleteStudents");

        new DeleteAsyncTask(studentDao).execute(students);
    }

    //刪除所有
    public void deleteAllStudents(){

        new DeleteAllAsyncTask(studentDao).execute();
    }

    //
    public void queryAllStudents() {
        Log.d("DBEngine", "enter queryAllStudents");
        new QueryAsyncTask(studentDao).execute();
    }

    //插入task
    static class AddAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public AddAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.addStudents(students);
            return null;
        }
    }

    //更新task
    static class UpdateAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public UpdateAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.updateStudents(students);
            return null;
        }
    }

    //刪除
    static class DeleteAsyncTask extends AsyncTask<Student, Void, Void> {

        private StudentDao studentDao;
        public DeleteAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
            Log.d("DBEngine", "enter DeleteAsyncTask");
        }

        @Override
        protected Void doInBackground(Student... students) {
            studentDao.deleteStudents(students);
            Log.d("DBEngine", "enter DeleteAsyncTask, doInBackground");

            return null;
        }
    }

    //刪除全部
    static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {

        private StudentDao studentDao;
        public DeleteAllAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            studentDao.deleteAllStudents();
            return null;
        }
    }

    static class QueryAsyncTask extends AsyncTask<Void, Void, Void> {

        private StudentDao studentDao;
        public QueryAsyncTask(StudentDao studentDao) {
            this.studentDao = studentDao;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Log.d("DBEngine" , "QueryAsyncTask doInBackground");
            List<Student> allStudents = studentDao.getAllStudents();
            Log.d("DBEngine" , "QueryAsyncTask doInBackground, size = " + allStudents.size());

            for (Student allStudent : allStudents) {
                Log.d("DBEngine" , "全部查詢每一項(xiàng): " + allStudent.toString());

            }
            return null;
        }
    }
}

3, User使用DBEngine

public class RoomDatabaseActivity extends Activity {

    private String TAG = RoomDatabaseActivity.class.getSimpleName();
    private DBEngine dbEngine;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_roomdatabase_layout);
        dbEngine = new DBEngine(this);
    }

    public void insertAction(View view) {
        Student student1 = new Student(20, "張三");
        Student student2 = new Student(30, "李四");
        Student student3 = new Student(15, "王五");
        Log.d(TAG, "insertAction...");
        dbEngine.addStudents(student1, student2, student3);
    }

    public void updateAction(View view) {
        Student student = new Student(28, "王二麻子");
        student.setId(3);
        dbEngine.updateStudents(student);
    }

    public void deleteAction(View view) {
        Log.d(TAG, "enter deleteAction");
        Student student = new Student();
        student.setId(3);
        dbEngine.deleteStudents(student);
    }

    public void queryAction(View view) {
        dbEngine.queryAllStudents();
    }

    public void deleteAll(View view) {
        dbEngine.deleteAllStudents();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末覆山,一起剝皮案震驚了整個(gè)濱河市竹伸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌簇宽,老刑警劉巖勋篓,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異魏割,居然都是意外死亡譬嚣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門钞它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拜银,“玉大人,你說我怎么就攤上這事遭垛∧嵬埃” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵锯仪,是天一觀的道長(zhǎng)泵督。 經(jīng)常有香客問我,道長(zhǎng)庶喜,這世上最難降的妖魔是什么幌蚊? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮溃卡,結(jié)果婚禮上溢豆,老公的妹妹穿的比我還像新娘。我一直安慰自己瘸羡,他們只是感情好漩仙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犹赖,像睡著了一般队他。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峻村,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天麸折,我揣著相機(jī)與錄音,去河邊找鬼粘昨。 笑死垢啼,一個(gè)胖子當(dāng)著我的面吹牛窜锯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芭析,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼锚扎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了馁启?” 一聲冷哼從身側(cè)響起驾孔,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惯疙,沒想到半個(gè)月后翠勉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霉颠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年眉菱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掉分。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡俭缓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酥郭,到底是詐尸還是另有隱情华坦,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布不从,位于F島的核電站惜姐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椿息。R本人自食惡果不足惜歹袁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寝优。 院中可真熱鬧条舔,春花似錦、人聲如沸乏矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痒给,卻和暖如春婉刀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背治唤。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工粱锐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓湾宙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親毅该。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巴碗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 Room是SQLite之上的一個(gè)抽象層凹嘲,通過Room,可以更加絲滑的使用SQLite的全部功能。并且,原本在...
    developerChenxi閱讀 3,742評(píng)論 1 14
  • 1.AsyncTask抽象類 功能:AsyncTask 屬于安卓中實(shí)現(xiàn)多線程的一種方法束亏,可以在該線程中實(shí)施耗時(shí)方法...
    神秘的小胖籽閱讀 1,243評(píng)論 0 0
  • Room是Jetpack中的一個(gè)組件定铜,處理和配置數(shù)據(jù)庫的瑣事,內(nèi)部實(shí)現(xiàn)還是SQLite 數(shù)據(jù)通常使用數(shù)據(jù)類表示...
    d2665f7588cb閱讀 433評(píng)論 0 0
  • 表情是什么揣炕,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息鹰溜。高興了當(dāng)然就笑了罩锐,難過就哭了卤唉。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,299評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)桑驱,但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能痊硕。 ...
    yichen大刀閱讀 6,057評(píng)論 0 4