Android Jetpack 一个demo两分钟完全掌握Room数据库

本文围绕Room数据库展开,介绍其包含的Database、Entity、DAO三个重要组件,以及封装流程和对Kotlin的支持。还提及数据库使用的注意事项,如迁移、线程处理等。阐述了设置索引和外键的方法,对比了Room与greendao的优缺点,并说明了Room的使用步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Room:数据库封装

1.Entity          基本

2.interface     基本

3.Database     基本

4.ViewModel   封装整个流程,代替present

5.Util:封装数据

 

 

Room包含3个重要组件:

  • Database:包含数据库容器,并作为到应用程序的持久关系数据的基础连接的主要访问点
  • Entity:表示数据库中的一个表。
  • DAO:包含用于访问数据库的方法

 

 

数据库注意地方:

1.唯一的对象

2.多线程

 

 

1.如果要删除一个字段怎么办?数据库迁移,因为不支持直接删

2.asyncTask,里面有个进度的方法

3.viewModel用法和room结合。update方法用它得观察者监听

AndroidViewModel

4.room对kotlin非常好的支持

6.是否是一个bean一个数据库?

7.是否支持一个库多个表?

@Database(entities = {User.class, Book.class}, version = 3)
mAppDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "android_room_dev.db")
                           .allowMainThreadQueries()
                           .addMigrations(MIGRATION_1_2, MIGRATION_2_3)
                           .build();

8.room要自己些线程,而greendao封装好了

9.studio有插件可以直接看数据库

10.room数据库升级,要写多个Migration2——3,3--4

巨大的缺点,升级很麻烦:

  /**
     * 数据库版本 1->2 user表格新增了age列
     */
    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("ALTER TABLE user " + " ADD COLUMN age INTEGER");
        }
    };

优点:

设置索引

       数据库索引用于提高数据库表的数据访问速度的。数据库里面的索引有单列索引和组合索引。Room里面可以通过@Entity的indices属性来给表格添加索引。

设置外键

       因为SQLite是关系形数据库,表和表之间是有关系的。这也就是我们数据库中常说的外键约束(FOREIGN KEY约束)。Room里面可以通过@Entity的foreignKeys属性来设置外键。我们用一个具体的例子来说明。

 




比较:

1.greendao有好多功能无法实现,配合rxjava,和google的架构组件

多表有点问题

2.room 升级数据库和异步请求问题和性能问题

 

 

使用:

    implementation "android.arch.persistence.room:runtime:1.1.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.1.0"

 

/**
 * 通过@Entity 注解 建立一个表
 */
@Entity
public class Student {
    @PrimaryKey(autoGenerate = true) int id;
    @ColumnInfo String name;
    @ColumnInfo String sex;
    @ColumnInfo int age;

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

(3)创建数据库

/**
 * 创建数据库
 * 通过entities 指定数据库中的表
 * version指定当前数据库版本号
 */
@Database(entities = {Student.class},version = 1)
public abstract class RoomDbManager extends RoomDatabase {
    public abstract StudentDao getStudentDao();
}

(4)创建访问数据库的方法

/**
 * 创建访问数据库的方法
 */
@Dao
public interface StudentDao {

    @Insert
    void insertOne(Student student);

    @Delete
    void deleteOne(Student student);

    @Update
    void update(Student student);

    @Query("SELECT * FROM Student")
    List<Student> getAll();
}

(5)使用步骤

 private RoomDbManager roomDb;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //步骤一:获取数据库实例
        if (room_blcs == null) {
            roomDb= Room.databaseBuilder(getApplicationContext(),
                    RoomDbManager.class, "room_blcs").build();
        }
        //步骤二:获取访问数据库的方法实例
        StudentDao studentDao = roomDb.getStudentDao();

        //步骤三:访问StudentDao 方法执行数据库操作:增删改查
        //注:这些方法不能在主线程(UI线程)上执行,需要创建新的线程来执行这些耗时操作。

        //增:studentDao.insertOne(student);

        //删:studentDao.deleteOne(student)

        //改:studentDao.update(student)

        //查:List<Student> all = studentDao.getAll()
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值