这是我参与「第四届青训营 」笔记创作活动的第8天
数据库
数据库框架对比
Room
Room 提供了 SQLite API的抽象层,便于流畅的访问SQLite。SQLiite API所有必需的包,参数,方法和变量都使用简单的注释Annotation来表示。相应的Annotation如下:
- @Entity:数据库关联的数据实体类,每一个数据实体类对应数据库的一张表
- @Dao:使用一个接口类来表示Dao(Data Access Object)
- @Database:使用此注释的类会创建一个抽象的Dao
- @PrimaryKey:标识属性为表的主键
- @Insert:插入到表的数据
- @Update:更新到表数据
- @Delete:删除表的数据
- @Query:执行SQL查询
主要的三个组件:
- 数据库类(
Database),用于保存数据库并作为应用持久性数据底层连接的主要访问点。
- 数据实体(
Entity),用于表示应用的数据库中的表。
- 数据访问对象(
DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
使用方法
1、在Gradle目录的build.gradle文件中添加gradle依赖关系
dependencies {
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
//以下都是依赖项,根据需要选择
// optional - RxJava2 support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - RxJava3 support for Room
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
// optional - Paging 3 Integration
implementation "androidx.room:room-paging:2.5.0-alpha02"
}
2、设计数据表
设计一个表,表名为Word,数据表包含id,word,chinese_meaning3个字段
注意:以下代码只截取了一部分
2.1、新建Entity
@Entity
public class Word { // 实体类
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "english_word")
private String word;
@ColumnInfo(name = "chinese_meaning")
private String chineseMeaning;
2.2、新增DAO
定义一个名为WordrDao的DAO,用来对Word表的增删改查
@Dao
public interface WordDao {
@Insert
void insertWord(Word... words);
@Update
void updateWord(Word... words);
@Delete
void deleteWord(Word... words);
@Query("DELETE FROM WORD")
void deleteAllWords();
@Query("SELECT * FROM WORD ORDER BY ID DESC")
List<Word> getAllWords();
}
2.3、新建数据库类
进行数据库配置,并满足以下几个条件:
- 新增一个
RoomDatabase的abstract子类
- 子类需加注解
@Database(entities = [xxx], version = n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
- 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
@Database(entities = {Word.class},version = 1,exportSchema = false)
public abstract class WordDatabase extends RoomDatabase{
public abstract WordDao getWordDao();
}
2.4、获取dao对象
进行数据库的增删改查操作
以插入为例:
wordDatabase = Room.databaseBuilder(this,WordDatabase.class,"word_database").allowMainThreadQueries().build();// .allowMainThreadQueries() 是指强制在主线程中执行,实际不要这样做
wordDao = wordDatabase.getWordDao();
buttonInsert = findViewById(R.id.buttonInsert);
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Word word1 = new Word("Hello","你好");
Word word2 = new Word("World","世界");
wordDao.insertWord(word1,word2);
updateView();
}
});
最终结果
此处更改了id为40的表项,并删除了id为32的表项,还进行了清空操作
总结
结语
在编写过程中,一定要注意包的导入,切记切记!!!
以上内容并不全面,仅是个人练习学习的一个笔记,更详细内容请自行网上搜索