可以快速流暢的訪問 Sqlite 數(shù)據(jù)庫
查看jetpack 官方文檔,導(dǎo)入依賴
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<Word> queryAll();
/**
* 全部刪除
*
* @Query("DELETE FROM WORD")
*/
@Delete()
void deleteAll(List<Word> 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);
...
最基礎(chǔ)的使用如上
升級版 引入LiveData,AsyncTask 要糊,ViewModel , 在ViewModel 中再使用Repository將數(shù)據(jù)庫操作封裝。
WordRepository
package com.bg.ppjoke.db;
import android.content.Context;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import java.util.List;
/**
* 單獨操作數(shù)據(jù)庫
*/
public class WordRepository {
private static WordDao wordDao;
private LiveData<List<Word>> allWords;
public WordRepository(Context context) {
WordDatabase database = WordDatabase.getInstance(context.getApplicationContext());
wordDao = database.getWordDao();
allWords = wordDao.queryAllWords();
}
public LiveData<List<Word>> 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);
}
/**
* 插入任務(wù) ;
*/
static class InsertAsyncTask extends AsyncTask<Word, Void, Void> {
@Override
protected Void doInBackground(Word... words) {
wordDao.insert(words);
return null;
}
}
/**
* 全部刪除 任務(wù) ;
*/
static class DeleteAllAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
wordDao.deleteAll();
return null;
}
}
/**
* 更新
*/
static class DeleteAsyncTask extends AsyncTask<Word, Void, Void> {
@Override
protected Void doInBackground(Word... words) {
wordDao.delete(words);
return null;
}
}
/**
* 更新
*/
static class UpdateAsyncTask extends AsyncTask<Word, Void, Void> {
@Override
protected Void doInBackground(Word... words) {
wordDao.update(words);
return null;
}
}
}
WordDatabase 實現(xiàn)單例
@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<List<Word>> allWords;
private WordRepository repository;
public DbViewModel(@NonNull Application application) {
super(application);
repository = new WordRepository(application);
allWords = repository.getAllWords();
}
public LiveData<List<Word>> 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
暴力行為 送粱,不保留原來數(shù)據(jù)旷坦, 或者直接卸載app
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), WordDatabase.class, "test_databse")
.fallbackToDestructiveMigration()
.build();
}
如果要保留原有數(shù)據(jù)
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) {
// 需要執(zhí)行 SQL 語句
database.execSQL("ALTER TABLE word ADD COLUMN sex INTEGER NOT NULL DEFAULT 1");
}
};
如果要刪除 column 就要先創(chuàng)建一個 新的 表, 把原來的數(shù)據(jù)復(fù)制使鹅,然后刪除舊表绝淡,改名新表...