android room源码分析,初探 Android Room 的使用

在 build.gradle 中引入依赖

dependencies {

...

implementation "android.arch.persistence.room:runtime:1.0.0"

annotationProcessor "android.arch.persistence.room:compiler:1.0.0"

...

}

创建实体类

@Entity(tableName = "user")

public class User {

@PrimaryKey

private int uid;

@ColumnInfo(name = "first_name")

private String firstName;

@ColumnInfo(name = "last_name")

private String lastName;

public User() {

}

@Ignore

public User(int uid, String firstName, String lastName) {

this.uid = uid;

this.firstName = firstName;

this.lastName = lastName;

}

// 此处省略了Getter/Settter方法...

}

创建Dao接口类,这里只演示了最基本的增删改查,这个接口不需要写实现类,它的实现类会由 android 根据方法上的注解自动生成

@Dao

public interface UserDao {

@Query("SELECT * FROM user")

List getAll();

@Insert

void insertAll(User...users);

@Delete

void delete(User user);

@Update

void update(User user);

@Query("DELETE FROM user")

void deleteAll();

}

创建继承自 RoomDatabase 的抽象类,这个类时访问数据库的关键。在这个抽象类中用注解配置与数据库中的表相关联的实体类,并提供返回 Dao 对象的抽象方法。

@Database(entities = {User.class}, version = 1)

public abstract class AppDatabase extends RoomDatabase {

public abstract UserDao userDao();

}

在build.gradle 中配置数据库的Schema的导出路径, 如下配置的导出路径为 app/schemas/

android {

...

defaultConfig {

...

javaCompileOptions {

annotationProcessorOptions {

arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]

}

}

...

}

...

}

如果不需要导出Schema,可以再第四步中使用如下配置

@Database(entities = {User.class}, version = 1, exportSchema = false)

因为是在界面中使用一个按钮触发测试代码,所以写在了 onClick 方法中

public class MainActivity extends AppCompatActivity {

...

public void onClick(View view) {

// 获得 AppDatabase 的对象,传入的第三个参数为数据库中表的名字

AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "user").build();

final UserDao userDao = db.userDao();

// 访问数据库的操作要在子线程中执行

Thread thread = new Thread(new Runnable() {

@Override

public void run() {

userDao.deleteAll();

System.out.println("----------- INSERT U1 U2 -------------");

User u1 = new User(1, "a", "b");

User u2 = new User(2, "c", "d");

userDao.insertAll(u1, u2);

List users = userDao.getAll();

System.out.println(users.toString());

System.out.println("------------- DELETE U2 --------------");

userDao.delete(u2);

users = userDao.getAll();

System.out.println(users.toString());

u1.setFirstName("aa");

u1.setLastName("bb");

System.out.println("------------- UPDATE U1 --------------");

userDao.update(u1);

users = userDao.getAll();

System.out.println(users.toString());

}

});

thread.start();

}

...

}

测试结果

I/System.out: ----------- INSERT U1 U2 -------------

I/System.out: [User{uid=1, firstName='a', lastName='b'}, User{uid=2, firstName='c', lastName='d'}]

I/System.out: ------------- DELETE U2 --------------

I/System.out: [User{uid=1, firstName='a', lastName='b'}]

I/System.out: ------------- UPDATE U1 --------------

I/System.out: [User{uid=1, firstName='aa', lastName='bb'}]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值