美文网首页
初探 Android Room 的使用

初探 Android Room 的使用

作者: Fighting_c2a6 | 来源:发表于2018-03-23 17:41 被阅读0次
  1. build.gradle 中引入依赖
dependencies {
    ...
    implementation "android.arch.persistence.room:runtime:1.0.0"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
    ...
}
  1. 创建实体类
@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方法...

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

    @Query("SELECT * FROM user")
    List<User> getAll();

    @Insert
    void insertAll(User...users);

    @Delete
    void delete(User user);

    @Update
    void update(User user);

    @Query("DELETE FROM user")
    void deleteAll();

}
  1. 创建继承自 RoomDatabase 的抽象类,这个类时访问数据库的关键。在这个抽象类中用注解配置与数据库中的表相关联的实体类,并提供返回 Dao 对象的抽象方法。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    public abstract UserDao userDao();

}
  1. build.gradle 中配置数据库的Schema的导出路径, 如下配置的导出路径为 app/schemas/
android {
    ...
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            }
        }
        ...
    }
    ...
}

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

@Database(entities = {User.class}, version = 1, exportSchema = false)
  1. 因为是在界面中使用一个按钮触发测试代码,所以写在了 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<User> 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();
    }
    ...
}

  1. 测试结果
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'}]

8.附上源码:https://github.com/hanyuwenn/RoomDemo

相关文章

网友评论

      本文标题:初探 Android Room 的使用

      本文链接:https://www.haomeiwen.com/subject/qusxcftx.html