安卓学习02---room

知识为进步之母,而进步又为富强之源泉。这篇文章主要讲述安卓学习02---room相关的知识,希望能为你提供帮助。

title: 安卓学习02---room date: 2020-02-02 18:20:13 tags:

room是jetpack的组件,可以使程序流畅的访问sqlite。
< !--more -->
1、依赖的添加
dependencies { def room_version = "2.2.2" ? 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" }

 
2、room的使用 1、Entity(表结构)相当于java web中的实体类。以单词为例,Entity应为:
package com.example.roombasic; ? 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_mean") private String chineseMean; ? public Word(String word, String chineseMean) { this.word = word; this.chineseMean = chineseMean; } ? 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 getChineseMean() { return chineseMean; } ? public void setChineseMean(String chineseMean) { this.chineseMean = chineseMean; } }

 

?

  • 必须在类前使用注解 @Entity 来声明。
  • 表结构中必须有一个主键,主键的声明为 @PrimaryKey ,而主键递增则在其后添加 (autoGenerate = true)。
  • 列名的注解使用 @ColumnInfo ,可以定义表结构中的列名,如 (name = "english_word") 。
2、daodao是一个接口,只需要写接口即可。
package com.example.roombasic; ? import androidx.lifecycle.LiveData; 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 public interface WordDao { ? @Insert void addWords(Word... words); ? @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< Word> getAllWords(); LiveData< List< Word> > getAllWordsLive(); }

 

?
?

  • 同样需要使用注解来声明 @Dao 。
  • 每种接口需要使用注解来声明,如@Insert、@Update、@Delete。
  • @Query("select * from word order by id desc") 是查询语句。
  • 接口暂时不需要自己来实现,room已经帮我们写出了具体的代码。
  • Word... words 表明可以传进多个参数。类名... 对象名s 代表可以传递多个参数。
3、databasedatabase来获得dao
package com.example.roombasic; ? import android.content.Context; ? import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; @Database(entities = {Word.class},version = 1,exportSchema = false) public abstract class WordDatabase extends RoomDatabase { private static WordDatabase INSTANCE; static synchronized WordDatabase getDatabase(Context context){ if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(),WordDatabase.class,"word_database") .build(); } return INSTANCE; } ? public abstract WordDao getWordDao(); }

 

?

  • 需要使用注解来声明 @Database(entities = {Word.class},version = 1,exportSchema = false)
    • entities = {Word.class}的{}中来填写entity,可添加多个。
    • version 是当前数据库版本。
    • exportSchema 暂时不知道干什么用,需要写上。
  • synchronized为java中的锁机制,多线程防止出错。
  • Room.databaseBuilder(context.getApplicationContext(),WordDatabase.class,"word_database").build
    • 【安卓学习02---room】第一个参数是activity,第二个参数为database的映射,第三个参数为数据库名称。

    推荐阅读