Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。
该库可帮助您在运行应用的设备上创建应用数据的缓存。此缓存充当应用的单一可信来源,使用户能够在应用中查看关键信息的一致副本,无论用户是否具有互联网连接。
Room 包含 3 个主要组件:
数据库: 包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。
使用 @Database 注释的类应满足以下条件:
是扩展 RoomDatabase 的抽象类。
在注释中添加与数据库关联的实体列表。
包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。
在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。
Entity: 表示数据库中的表。
DAO: 包含用于访问数据库的方法。
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
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
添加并Sync同步
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Word {
@PrimaryKey(autoGenerate = true) //自动生成主键
private int id;
@ColumnInfo(name = "english_word") //列名
private String word;
@ColumnInfo(name = "chinese_meaning")
private String chineseMeaning;
/*
* 构造方法与get(),set()方法
* 构造方法id不用写
* id的set()方法也可不写
* */
public Word(String word, String chineseMeaning) {
this.word = word;
this.chineseMeaning = chineseMeaning;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getChineseMeaning() {
return chineseMeaning;
}
public void setChineseMeaning(String chineseMeaning) {
this.chineseMeaning = chineseMeaning;
}
}
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao //Database access object的缩写,访问数据库操作接口
public interface WordDao {
//增删改查均在此进行声明
@Insert //此类修饰词均是为了给后续做方便,为了直接引用系统中的数据库代码函数
void insertWords (Word... words); //一个参数括号中就写一个(Word word),多个用省略号表示(Word... word)
@Update
void updateWords (Word... words);
@Delete
void deleteWords (Word... words);
@Query("DELETE FROM WORD")
void deleteAllWords();
@Query("SELECT * FROM WORD ORDER BY ID DESC")
List getAllWords();
}
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Word.class},version = 1,exportSchema = false) //三个参数分别为数据库中的表、数据库版本号和导出模式
public abstract class WordDatabase extends RoomDatabase {
public abstract WordDao getWordDao(); //只需写一个函数原型即可
}
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
WordDatabase wordDatabase;
WordDao wordDao;
TextView textView;
Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取database对象需要一个函数并创建
wordDatabase = Room.databaseBuilder(this,WordDatabase.class,"word_database")
.allowMainThreadQueries() //强制允许主线程执行,该方法不好,
.build();
wordDao = wordDatabase.getWordDao();
textView = findViewById(R.id.textView);
updateView();
buttonInsert = findViewById(R.id.buttonInsert);
buttonClear = findViewById(R.id.buttonClear);
buttonDelete = findViewById(R.id.buttonDelete);
buttonUpdate = findViewById(R.id.buttonUpdate);
//插入
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word1 = new Word("Hello","你好");
Word word2 = new Word("World","世界");
wordDao.insertWords(word1,word2);
updateView();
}
});
//清空
buttonClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wordDao.deleteAllWords();
updateView();
}
});
//删除
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word = new Word("",""); //删除只与id有关,内容无所谓
word.setId(1); //根据ID修改对应的表单名
wordDao.deleteWords(word);
updateView();
}
});
//修改
buttonUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Word word = new Word("Android","安卓");
word.setId(1); //根据ID修改对应的表单名
wordDao.updateWords(word);
updateView();
}
});
}
void updateView () { //数据的显示
List list = wordDao.getAllWords();
String text = "";
for (int i = 0;i < list.size();i++) {
Word word = list.get(i);
text += word.getId() + ":" + word.getWord() + "=" + word.getChineseMeaning() + "\n";
}
textView.setText(text);
}
}
如果发现运行时gradle构建超时,那就是网络问题,网络不行可以选择架梯子,或者用国内镜像站点替换jcenter和google这两个repository
此处粘贴一下使用阿里云国内镜像方法:
对单个项目生效,在项目中的build.gradle修改内容再构建即可(要注意网络尽量保持通畅,构建时间因设备而异,请耐心等待)
buildscript {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}
}
对所有项目起作用
在USER_HOME/.gradle/下创建init.gradle文件
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/groups/public'
def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
}
}
maven {
url ALIYUN_REPOSITORY_URL
url ALIYUN_JCENTER_URL
}
}
}
运行效果如下:
点击Insert按钮进行插入数据:
点击Update按钮进行对第一条数据的更新修改:
点击Delete按钮将第一条数据进行删除:
点击Clear按钮将数据清空:
关于JetPack中的Room讲了3个概念, Database/Entity/Dao, database就是数据库,Entity就是一个实体类, Dao是 对Entity操作的封装 ,要想实现对数据库增删改查, 那么先创建一个Database对象,用这个对象获取数据的Dao,然后调用Dao的方法就可以了。