Android 开发(数据存储)_Jetpack Room框架
Jetpack Room数据库处理框架
Room的简单介绍:
- Room是谷歌公司推出的数据库处理框架,该框架同样基于SQLit,但他通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量
Room框架的导入:
在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加下面两行配置,表示导入指定版本的Room库
implementation 'androidx.room:room-runtime:2.2.5'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
例如:
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'androidx.room:room-runtime:2.2.5'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
}
Room框架的编码步骤:
通过一个书籍信息案例来展示Room框架的编码过程
- 首先创建一个书籍信息对象的实体类 相当于一个表还有里面的一些字段
@Entity
public class Bookinfo {
@PrimaryKey(autoGenerate = true)
private int id;//主键id设置为自动增长
private String name;//书名
private String author;//作者
private String press;//出版社
private double price;//价格
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Bookinfo{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", press='" + press + '\'' +
", price='" + price + '\'' +
'}';
}
}
需要在实体类的类名上一行打上这个注解 @Entity 它会根据这个类生成一些代码
然后在需要指定主键的字段上面打上 @PrimaryKey(autoGenerate = true) 这个注解,用于指定这个字段是主键,表示为自动增长
- 然后创建一个接口 相当于一些数据库语句
@Dao
public interface BookDao {
//添加书籍信息
@Insert
void insert(Bookinfo... book);
//删除书籍信息
@Delete
void delete(Bookinfo... book);
//删除所有书籍
@Query("DELETE FROM Bookinfo")
void deleteAll();
//修改书籍信息
@Update
int update(Bookinfo... book);
//查询所有书籍
@Query("SELECT * FROM bookinfo")
List<Bookinfo> queryAll();
//根据书名查询书籍
@Query("SELECT * FROM bookinfo WHERE NAME = :name ORDER BY ID DESC LIMIT 1")
Bookinfo queryName(String name);
}
需要在实体类的类名上一行打上这个注解 @Dao
需要在添加的方法上一行打上这个注解 @Insert
需要在删除的方法上一行打上这个注解 @Delete("DELETE FROM Bookinfo") 表示为删除Bookinfo这个表中所有的数据 也可以写自定义的删除SQL语句
需要在修改的方法上一行打上这个注解 @Update
需要在修改的方法上一行打上这个注解 @Query("SELECT * FROM Bookinfo") 表示为查询Bookinfo这个表中所有的数据 也可以写自定义的查询SQL语句
例如 : void insert(Bookinfo... book) 这条语句表示为添加对象为Bookinfo这个对象,... 三个点表示为可变参数,即传参时可以传多个参数
- 提供一个抽象类继承于RoomDatabase 相当于数据库的基本信息
/*
entities表示数据库有哪些表
version数据库版本
exportSchema,建议设置为false,若设为true还需指定json文件的保存路径
*/
@Database(entities = {Bookinfo.class},version = 1,exportSchema = true)
public abstract class BookDatabase extends RoomDatabase {
public abstract BookDao bookDao();
}
需要在实体类的类名上一行打上这个注解 @Database(entities = {Bookinfo.class},version = 1,exportScheam = true)
entities这个数组里面可以放多个对象,即可以创建多张表
exportScheam,相当于数据库的日志表,用于存储数据库的已执行的语句,若需要用则需指定一个路径用于保存这个日志
- 然后在Application里面进行下面的操作
//声明一个书籍数据库对象
private BookDatabase bookDatabase;
然后在oncreat方法里面来构建一个数据库实例,这样就可以在应用启动的时候去构建这样的一个实例
@Override
public void onCreate() {
super.onCreate();
mApp = this;
bookDatabase = Room.databaseBuilder(this,BookDatabase.class,"book")
/*允许迁移数据库(发生数据库变更是,
Room默认删除原数据库再创建新数据库,但是这样的操作会把原来的数据删除,
所以改为addMigrations方式以便保存原有记录*/
.addMigrations()
//允许在主线程中操作数据库(Room默认不能在主线程中操作数据库)
.allowMainThreadQueries()
.build();
}
需要传一个上下文,因为Application也是一个上下文所以这里传this,然后就是当前对象的一个类,最后一参数为数据库名。
然后获取数据库的实例:
public BookDatabase getBookDB(){
return bookDatabase;
}
- 然后创建一个Activity
xml布局如下
Java代码如下
public class RoomWriteActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_name, et_author, et_press, et_price;
private Button btn_z, btn_s, btn_g, btn_c;
private BookDao bookDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_room_write);
et_name = findViewById(R.id.et_name);
et_author = findViewById(R.id.et_author);
et_press = findViewById(R.id.et_press);
et_price = findViewById(R.id.et_price);
btn_z = findViewById(R.id.btn_z);
btn_s = findViewById(R.id.btn_s);
btn_g = findViewById(R.id.btn_g);
btn_c = findViewById(R.id.btn_c);
btn_c.setOnClickListener(this);
btn_g.setOnClickListener(this);
btn_z.setOnClickListener(this);
btn_s.setOnClickListener(this);
bookDao = MyApplication.getInstance().getBookDB().bookDao();
}
@Override
public void onClick(View view) {
String name = et_name.getText().toString();
String author = et_author.getText().toString();
String press = et_press.getText().toString();
String price = et_price.getText().toString();
switch (view.getId()) {
case R.id.btn_z:
//声明一个书籍信息对象,并填写它的各个字段值
Bookinfo b1 = new Bookinfo();
b1.setName(name);
b1.setAuthor(author);
b1.setPress(press);
b1.setPrice(Double.parseDouble(price));
bookDao.insert(b1);
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_s:
Bookinfo b2 = new Bookinfo();
b2.setId(1);
break;
case R.id.btn_g:
Bookinfo b3 = new Bookinfo();
Bookinfo b4 = bookDao.queryName(name);
b3.setId(b4.getId());
b3.setName(name);
b3.setAuthor(author);
b3.setPress(press);
b3.setPrice(Double.parseDouble(price));
bookDao.update(b3);
break;
case R.id.btn_c:
List<Bookinfo> list = bookDao.queryAll();
for (Bookinfo b : list){
Log.d("GG-bond",b.toString());
}
break;
}
}
}
通过来获取帮助实例:
BookDao bookDao = MyApplication.getInstance().getBookDB().bookDao();
- 点赞
- 收藏
- 关注作者
评论(0)