Android Jetpack系列(一) Room

Android Jetpack系列(一) Room

    • 前言
    • Room简介
    • Room使用
      • 1 引用
      • 2 编写Entity实体类
      • 2 编写Dao数据操作类
      • 3 编写Database数据库操作类
      • 4 调用
    • 示例

前言

  • Jetpack是2017年谷歌在开发者大会上发布的一套开发工具。
  • Jetpack共包含4个部分:Architecture、Foundation、Behavior 以及 UI 。
  • 其中的Architecture又称为AAC(Android Architecture Components),是谷歌推荐的android开发架构方案。
  • 此篇文章主要介绍Architecture中的Room
    Android Jetpack系列(一) Room_第1张图片

Room简介

  • Room 是Google为了简化旧式的SQLite操作专门提供的一个覆盖SQLite抽象层框架库;
  • 通过使用注解的方式,能够非常简单的实现SQLite的增、删、查、改功能;
  • 功能强大,覆盖SQLite的所有功能(表操作、版本升级等)。

组成部分及功能:

  • Entity : 实体类,数据表对应到实体类的映射。
  • Dao : 数据操作类,包含用于访问数据库的方法。
  • Database : 数据库持有者 & 数据库版本管理者。
  • Room : 数据库的创建者 & 负责数据库版本更新的具体实现者。

Room使用

1 引用

	
	// room
    implementation "android.arch.persistence.room:runtime:1.1.1"
    annotationProcessor "android.arch.persistence.room:compiler:1.1.1"

    // 可选项 - Room适配Rxjava组件
    implementation "android.arch.persistence.room:rxjava2:1.1.1"

    // 可选项 - Guava support for Room, including Optional and ListenableFuture
    implementation "android.arch.persistence.room:guava:1.1.1"

    // Test helpers
    testImplementation "android.arch.persistence.room:testing:1.1.1"
    

2 编写Entity实体类


@Data
@Entity(tableName = "USER")
public class UserModel {
    @PrimaryKey
    @ColumnInfo(name = "USER_ID")
    public int id;
    @ColumnInfo(name = "NAME")
    public String name;
    @ColumnInfo(name = "AGE")
    public int age;
    @ColumnInfo(name = "ADDRESS")
    public String address;
    @Ignore
    public String phone;
}

其中使用到的注解:

  • @Entity :数据表的实体类,tableName指定了表名。
  • @PrimaryKey :表的主键。
  • @ColumnInfo :指定字段名,不加此标注则字段名取变量名。
  • @Ignore :标注此字段不需要添加到数据表中。

还有其他注释:

  • @Embedded :实体类中引用其他实体类。
  • @ForeignKey :外键约束。

2 编写Dao数据操作类


@Dao
public interface UserDao {

    @Query("SELECT * FROM USER")
    List<UserModel> getAllUsers();

    @Query("SELECT * FROM USER WHERE USER_ID = :id")
    UserModel getUserById(int id);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertUser(UserModel userModel);

    @Query("UPDATE USER SET NAME = :name AND PHONE = :phone WHERE USER_ID = :id")
    void updateUser(int id, String name, String phone);

    @Update(onConflict =  OnConflictStrategy.REPLACE)
    void updateUsers(UserModel... users);

    @Query("DELETE FROM USER WHERE USER_ID = :id")
    void deleteUserById(int id);

    @Delete
    void deleteUsers(UserModel... users);
}

注解说明:

  • @Dao:标注数据库操作的类。
  • @Query:包含所有Sqlite语句操作。其中带参数的查询可参考getUserById方法。
  • @Insert:标注数据库的插入操作。
  • @Delete:标注数据库的删除操作。
  • @Update:标注数据库的更新操作。

3 编写Database数据库操作类

为了防止频繁创建Database类,我在这里使用了单例模式,加快数据库访问速度。


@Database(entities = {UserModel.class}, version = 1)
public abstract class MyDataBase extends RoomDatabase {

    private static MyDataBase instance;

    public static MyDataBase getInstance(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context.getApplicationContext(), MyDataBase.class, "mydata.db").allowMainThreadQueries().build();
        }
        return instance;
    }

    public abstract UserDao userDao();
}

在创建RoomDatabase时,databaseBuilder可以接多个方法对RoomDatabase进行设置:


	/**
     * 默认值是FrameworkSQLiteOpenHelperFactory,设置数据库的factory。比如我们想改变数据库的存储路径可以通过这个函数来实现
     */
    public RoomDatabase.Builder<T> openHelperFactory(@Nullable SupportSQLiteOpenHelper.Factory factory);

    /**
     * 设置数据库升级(迁移)的逻辑
     */
    public RoomDatabase.Builder<T> addMigrations(@NonNull Migration... migrations);

    /**
     * 设置是否允许在主线程做查询操作
     */
    public RoomDatabase.Builder<T> allowMainThreadQueries();

    /**
     * 设置数据库的日志模式
     */
    public RoomDatabase.Builder<T> setJournalMode(@NonNull JournalMode journalMode);

    /**
     * 设置迁移数据库如果发生错误,将会重新创建数据库,而不是发生崩溃
     */
    public RoomDatabase.Builder<T> fallbackToDestructiveMigration();

    /**
     * 设置从某个版本开始迁移数据库如果发生错误,将会重新创建数据库,而不是发生崩溃
     */
    public RoomDatabase.Builder<T> fallbackToDestructiveMigrationFrom(int... startVersions);

    /**
     * 监听数据库,创建和打开的操作
     */
    public RoomDatabase.Builder<T> addCallback(@NonNull RoomDatabase.Callback callback);
    

4 调用

在activity中调用:


public class MainActivity extends AppCompatActivity {

    @BindView(R.id.input_et)
    EditText inputET;
    @BindView(R.id.result_tv)
    TextView resultTV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.set_btn)
    void setUser() {
        String name = inputET.getText().toString();
        UserModel userModel = new UserModel();
        userModel.setName(name);
        userModel.setAddress("山东青岛");
        userModel.setAge(99);
        userModel.setPhone("15006512345");
        MyDataBase.getInstance(this).userDao().insertUser(userModel);
    }

    @OnClick(R.id.get_btn)
    void getUser(View v) {
        List<UserModel> users = MyDataBase.getInstance(this).userDao().getAllUsers();
        if (users != null && users.size() > 0) {
            resultTV.setText(users.get(0).getName());
        }
    }
}

示例

文中所写参考代码下载地址:下载

作者简介 :游逸,高级软件工程师,5年开发经验,微信公众号【逸游源码汇】,喜欢分享干货与关注技术前沿,欢迎关注公众号一起交流学习

你可能感兴趣的:(Android,Jetpack,Android,jetpack,Room,Android,AAC)