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

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年开发经验,微信公众号【逸游源码汇】,喜欢分享干货与关注技术前沿,欢迎关注公众号一起交流学习

696

被折叠的 条评论
为什么被折叠?



