人生何须万种愁,千里云烟一笑收
Room也是一个ORM框架,它在SQLite上提供了一个抽象层,屏蔽了部分底层的细节,使用对象对数据库进行操作,进行CRUD就像对象调用方法一样的简单。
谷歌官方给出了一张图片,可以更加直观的了解Room的组成部分:
?从上图可以看出,Room主要由三部分组成:
1,Room Database 数据库:底层连接的主要接入点,创建数据库就靠它了
2,Data Access Objects DAO:在DAO中会有一系列对数据库进行CRUD的方法声明
3,Entity 实体类:是对象与数据表的对应表现,设计实体类,并最后转化为对应的数据表
可以这么理解,我们通过实体类的中Getter和Setter方法对数据进行变更操作,然后Room Database使用DAO中的方法,对表中的数据进行对应的操作。从而屏蔽了繁琐的数据库原生操作。当然这其中使用了注解进行功能的标注。
1,在app的build.gradle里面添加依赖:
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
// 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"
2,创建表Entity:
@Entity
public class YuanZhen {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name ="name")
private String name;
@ColumnInfo(name ="age")
private int age;
@ColumnInfo(name ="address")
private String address;
@Ignore
private String sex;
public YuanZhen(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
return "YuanZhen{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
上面其中几个注解的含义:
①,@Entity?表示数据库中的表
②,@PrimaryKey?表示主键,autoGenerate?表示自增
③,@ColumnInfo?表示字段,name?表示字段名称
④,@Ignore 表示一个属性不加入生成表的字段,只是临时使用
3,创建Dao:
@Dao
public interface YuanZhenDao {
@Insert
void insert(YuanZhen... yuanzhens);
@Delete
void delete(YuanZhen yuanZhen);
@Update
void update(YuanZhen yuanZhen);
@Query("select * from YuanZhen")
List<YuanZhen> getAll();
}
这里面包含了增上改查。
其中几个注解的含义:
①,@Dao?表示访问?DB?的方法,需要声明为接口或抽象类,编译阶段将生成 _Impl 实现类,此处则将生成 YuanZhenDao_Impl.java 文件
②,@Insert、@Delete、@Update 、?@Query?分别表示数据库的增删改查方法
4,创建Room Database 数据库:
@Database(entities = {YuanZhen.class},version = 1,exportSchema = false)
public abstract class MyDatabase extends RoomDatabase {
public abstract YuanZhenDao yuanZhenDao();
}
其中几个注解的含义:
①,@Database:表示数据库的定义
②,entities: 表示数据库中包含的表
③,version:表示数据库版本号
5,使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));
List<YuanZhen> all = yuanZhenDao.getAll();
System.out.println("输出:"+all.toString());
}
}).start();
}
}
输出结果:
I/System.out: 输出:[YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}, YuanZhen{id=2, name='yz1', age=22, address='淄博市', sex='null'}, YuanZhen{id=3, name='yz', age=20, address='淄博市', sex='null'}
这就是基本使用。
如果我们想查询某一条数据的话,需要在dao里面增加条件查询:
@Dao
public interface YuanZhenDao {
@Insert
void insert(YuanZhen... yuanzhens);
@Delete
void delete(YuanZhen yuanZhen);
@Update
void update(YuanZhen yuanZhen);
@Query("select * from YuanZhen")
List<YuanZhen> getAll();
@Query("select * from YuanZhen where name like :name")
YuanZhen getByName(String name);
@Query("select * from YuanZhen where age in(:ages)")
List<YuanZhen> getByAges(int[] ages);
}
使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));
YuanZhen yz = yuanZhenDao.getByName("yz");
System.out.println("输出ByName:"+yz.toString());
int[] ages ={20,22};
List<YuanZhen> byAges = yuanZhenDao.getByAges(ages);
System.out.println("输出ByAges:"+byAges.toString());
}
}).start();
}
}
输出:
I/System.out: 输出ByName:YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}
I/System.out: 输出ByAges:[YuanZhen{id=1, name='yz', age=20, address='淄博市', sex='null'}, YuanZhen{id=2, name='yz1', age=22, address='淄博市', sex='null'}
如果只想查姓名和地址,那么可以新建一个类:
public class YuanZhenNew {
@ColumnInfo(name = "name")
public String name;
@ColumnInfo(name = "address")
public String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public YuanZhenNew(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "YuanZhenNew{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
在dao中查询:
@Dao
public interface YuanZhenDao {
@Insert
void insert(YuanZhen... yuanzhens);
@Delete
void delete(YuanZhen yuanZhen);
@Update
void update(YuanZhen yuanZhen);
@Query("select * from YuanZhen")
List<YuanZhen> getAll();
@Query("select * from YuanZhen where name like :name")
YuanZhen getByName(String name);
@Query("select * from YuanZhen where age in(:ages)")
List<YuanZhen> getByAges(int[] ages);
@Query("select name,address from YuanZhen ")
public List<YuanZhenNew> getNew();
}
使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
MyDatabase myDatabase = Room.databaseBuilder(getApplicationContext(),MyDatabase.class,"YuanZhenDb").build();
YuanZhenDao yuanZhenDao = myDatabase.yuanZhenDao();
yuanZhenDao.insert(new YuanZhen("yz",20,"淄博市"));
yuanZhenDao.insert(new YuanZhen("yz1",22,"淄博市"));
List<YuanZhenNew> aNew = yuanZhenDao.getNew();
System.out.println("输出aNew:"+aNew.toString());
}
}).start();
}
}
输出:
I/System.out: 输出aNew:[YuanZhenNew{name='yz', address='淄博市'}, YuanZhenNew{name='yz1', address='淄博市'}]
更多高级用法参考文章:Android--Jetpack--数据库Room详解二-CSDN博客