组成部分及功能:
// 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"
@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;
}
其中使用到的注解:
还有其他注释:
@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);
}
注解说明:
为了防止频繁创建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);
在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年开发经验,微信公众号【逸游源码汇】,喜欢分享干货与关注技术前沿,欢迎关注公众号一起交流学习