数据库 | 青训营笔记

117 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第8天

数据库

数据库框架对比

image.png

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依赖关系

image.png

image.png

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个字段

image.png 注意:以下代码只截取了一部分

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、新建数据库类

进行数据库配置,并满足以下几个条件:

  • 新增一个RoomDatabaseabstract子类
  • 子类需加注解@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();
    }
});

最终结果

image.png 此处更改了id为40的表项,并删除了id为32的表项,还进行了清空操作

总结

image.png

结语

在编写过程中,一定要注意包的导入,切记切记!!!
以上内容并不全面,仅是个人练习学习的一个笔记,更详细内容请自行网上搜索