Android 开发(数据存储)_Jetpack Room框架

举报
在下皮德狠 发表于 2022/11/07 16:29:34 2022/11/07
【摘要】 Jetpack Room数据库处理框架Room的简单介绍:Room是谷歌公司推出的数据库处理框架,该框架同样基于SQLit,但他通过注解技术极大简化了数据库操作,减少了原来相当一部分编码工作量Room框架的导入:       在使用Room之前,要先修改模块的build.gradle文件,往dependencies节点添加下面两行配置,表示导入指定版本的Room库implementation...

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();


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。