Jetpack_Room

可以快速流畅的访问 Sqlite 数据库
查看jetpack 官方文档,导入依赖

dependencies {
      def room_version = "2.2.3"

      implementation "androidx.room:room-runtime:$room_version"
      annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor

      // optional - Kotlin Extensions and Coroutines support for Room
      implementation "androidx.room:room-ktx:$room_version"

      // optional - RxJava support for Room
      implementation "androidx.room:room-rxjava2:$room_version"

      // optional - Guava support for Room, including Optional and ListenableFuture
      implementation "androidx.room:room-guava:$room_version"

      // Test helpers
      testImplementation "androidx.room:room-testing:$room_version"
    }

涉及到 三个 类 Entity , Dao, Database
Entity 类

@Entity
public class Word {

    @PrimaryKey(autoGenerate = true)
    private int id;

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

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

Dao 类

@Dao
public interface WordDao {
    @Insert
    void insert(Word... words);

   @Query("SELECT * FROM WORD")
   List queryAll();

    /**
     * 全部删除  
     *
     * @Query("DELETE FROM WORD")
     */
    @Delete()
    void deleteAll(List list);

    @Delete
    void delete(Word... word);

    @Update
    void update(Word... word);
}

Database 类

@Database(entities = Word.class, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {
    abstract WordDao getWordDao();
}

在 Activity中的使用

testDataBase = Room.databaseBuilder(this, WordDatabase.class, "test")
                .allowMainThreadQueries()
                .build();
testDao = testDataBase.getWordDao();
          // 插入
Word bean = new Word("张三", 21);
Word bean2 = new Word("李四", 24);
testDao.insert(bean, bean2);
          
          ...

最基础的使用如上
升级版 引入LiveData,AsyncTask ,ViewModel , 在ViewModel 中再使用Repository将数据库操作封装。
WordRepository

package com.bg.ppjoke.db;

import android.content.Context;
import android.os.AsyncTask;

import androidx.lifecycle.LiveData;

import java.util.List;

/**
 * 单独操作数据库
 */
public class WordRepository {

    private static WordDao wordDao;

    private LiveData> allWords;

    public WordRepository(Context context) {
        WordDatabase database = WordDatabase.getInstance(context.getApplicationContext());
        wordDao = database.getWordDao();
        allWords = wordDao.queryAllWords();
    }

    public LiveData> getAllWords() {
        return allWords;
    }

    void insert(Word... words) {
        new InsertAsyncTask().execute(words);
    }


    void deleteAll() {
        new DeleteAllAsyncTask().execute();
    }

    void delete(Word... words) {
        new DeleteAsyncTask().execute(words);
    }


    void update(Word... words) {
        new UpdateAsyncTask().execute(words);
    }


    /**
     * 插入任务 ;
     */
    static class InsertAsyncTask extends AsyncTask {

        @Override
        protected Void doInBackground(Word... words) {
            wordDao.insert(words);
            return null;
        }
    }


    /**
     * 全部删除 任务 ;
     */
    static class DeleteAllAsyncTask extends AsyncTask {
        @Override
        protected Void doInBackground(Void... voids) {
            wordDao.deleteAll();
            return null;
        }
    }


    /**
     * 更新
     */
    static class DeleteAsyncTask extends AsyncTask {

        @Override
        protected Void doInBackground(Word... words) {
            wordDao.delete(words);
            return null;
        }
    }

    /**
     * 更新
     */
    static class UpdateAsyncTask extends AsyncTask {
        @Override
        protected Void doInBackground(Word... words) {
            wordDao.update(words);
            return null;
        }
    }
}

WordDatabase 实现单例

@Database(entities = Word.class, version = 1, exportSchema = false)
public abstract class WordDatabase extends RoomDatabase {

    // 这里不能有,有了编译报错
//    private WordDatabase() {
//    }

    private static WordDatabase INSTANCE = null;

    public static WordDatabase getInstance(Context context) {

        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "test_databse")
                    .build();
        }

        return INSTANCE;
    }

   public abstract WordDao getWordDao();
}

ViewModel

public class DbViewModel extends AndroidViewModel {
    private LiveData> allWords;
    private WordRepository repository;

    public DbViewModel(@NonNull Application application) {
        super(application);

        repository = new WordRepository(application);
        allWords = repository.getAllWords();
    }

    public LiveData> getAllWords() {
        return allWords;
    }

    void insert(Word... words) {
        repository.insert(words);
    }


    void deleteAll() {
        repository.deleteAll();
    }

    void delete(Word... words) {
        repository.delete(words);
    }


    void update(Word... words) {
        repository.update(words);
    }
}

版本迁移 Migration
暴力行为 ,不保留原来数据, 或者直接卸载app

 if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "test_databse")
                    .fallbackToDestructiveMigration()
                    .build();
        }

如果要保留原有数据

 public static WordDatabase getInstance(Context context) {

        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "test_databse")
//                    .fallbackToDestructiveMigration()
                    .addMigrations(MIGRATION_1_2)
                    .build();
        }
        return INSTANCE;
    }
private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

            // 需要执行 SQL 语句
            database.execSQL("ALTER TABLE word ADD COLUMN sex INTEGER NOT NULL DEFAULT 1");
        }
    };

如果要删除 column 就要先创建一个 新的 表, 把原来的数据复制,然后删除旧表,改名新表...

你可能感兴趣的:(Jetpack_Room)