项目地址https://github.com/gms76575/simplearch2.git
介绍
Room是Google提供的一个ORM库。Room是一个数据持久化库,它是 Architecture Component的一部分。它让SQLiteDatabase的使用变得简单,大大减少了重复的代码,并且把SQL查询的检查放在了编译时。Room提供了三个主要的组件:
- @Database:@Database用来注解类,并且注解的类必须是继承自
RoomDatabase
的抽象类。该类主要作用是创建数据库和创建Daos(data access objects,数据访问对象)。 - @Entity:@Entity用来注解实体类,@Database通过
entities
属性引用被@Entity
注解的类,并利用该类的所有字段作为表的列名来创建表。 - @Dao:@Dao用来注解一个接口或者抽象方法,该类的作用是提供访问数据库的方法。在使用@Database注解的类中必须定一个不带参数的方法,这个方法返回使用@Dao注解的类。
使用
User.java
@Entity(tableName = "user")
public class UserEntity implements User
{
@NonNull
@PrimaryKey
private String uid;
private String name;
private String phone;
private int gender;
@ColumnInfo(name = "update_at")
private Date updateAt;
...
public UserEntity(@NonNull String uid, String name, String phone, int gender, Date update)
{
...
}
//如果有多个构造方法,使用 @Ignore注解告诉Room哪个用,哪个不用。
@Ignore
public UserEntity(User user)
{
...
}
dao
@Dao
public interface UserDao
{
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertOrUpdate(UserEntity user);
@Query("select uid,name,phone,gender,update_at from user where uid=:uid")
LiveData<UserEntity> getUserInfo(String uid);
@Query("select count(uid) from user where uid=:uid and date('now') - update_at<:outTime")
int notOutTime(String uid, long outTime);
}
database
@Database(entities = {UserEntity.class}, version = 1, exportSchema = false)
@TypeConverters(DateConverter.class)
public abstract class AppDatabase extends RoomDatabase {
//每次创建AppDatabase实例都会产生比较大的开销,所以应该将AppDatabase设计成单例的。
private static AppDatabase sInstance;
@VisibleForTesting
public static final String DATABASE_NAME = "basic-sample-db";
public abstract UserDao userDao();
private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();
public static AppDatabase getInstance(final Context context, final AppExecutors executors) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = buildDatabase(context.getApplicationContext(), executors);
sInstance.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return sInstance;
}
private static AppDatabase buildDatabase(final Context appContext,
final AppExecutors executors) {
return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
AppDatabase database = AppDatabase.getInstance(appContext, executors);
database.setDatabaseCreated();
}
}).build();
}
private void updateDatabaseCreated(final Context context) {
if (context.getDatabasePath(DATABASE_NAME).exists()) {
setDatabaseCreated();
}
}
private void setDatabaseCreated(){
mIsDatabaseCreated.postValue(true);
}
public LiveData<Boolean> getDatabaseCreated() {
return mIsDatabaseCreated;
}
}
repository
public class DataRepository {
private static DataRepository sInstance;
private final AppDatabase mDatabase;
private DataRepository(final AppDatabase database) {
mDatabase = database;
}
public static DataRepository getInstance(final AppDatabase database) {
if (sInstance == null) {
synchronized (DataRepository.class) {
if (sInstance == null) {
sInstance = new DataRepository(database);
}
}
}
return sInstance;
}
public void insertOrUpdate(UserEntity user){
mDatabase.userDao().insertOrUpdate(user);
}
public LiveData<UserEntity> getUserInfo(String uid){
return mDatabase.userDao().getUserInfo(uid);
}
public boolean notOutTime(String uid, long outTime){
return mDatabase.userDao().notOutTime(uid, outTime)>0;
}
}
application
public class BasicApp extends Application
{
private AppExecutors mAppExecutors;
@Override
public void onCreate() {
super.onCreate();
mAppExecutors = new AppExecutors();
}
public AppDatabase getDatabase() {
return AppDatabase.getInstance(this, mAppExecutors);
}
public DataRepository getRepository() {
return DataRepository.getInstance(getDatabase());
}
}
ui
LoginActiviy.java
@Override
protected Boolean doInBackground(Void... params)
{
try
{
// Simulate network access.
UserEntity user = new UserEntity(UUID.randomUUID().toString(),"zhangquandan",mPhone,1,new Date(System.currentTimeMillis()));
((BasicApp)getApplication()).getRepository().insertOrUpdate(user);
SharedPreferences sp = getSharedPreferences("pet", MODE_PRIVATE);
sp.edit().putString("uid", user.getUid()).apply();
Thread.sleep(2000);
}
catch (InterruptedException e)
{
return false;
}
return "000000".equals(mPassword);
}
MyFragment.java
public class MyFragment extends Fragment implements LifecycleOwner
{
private FragmentMyBinding mBinding;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_my, container, false);
return mBinding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
SharedPreferences sp = getActivity().getSharedPreferences("pet", Activity.MODE_PRIVATE);
((BasicApp)getActivity().getApplication()).getRepository().getUserInfo(sp.getString("uid", ""))
.observe(this,user->mBinding.setMy(user));
}
}
项目地址https://github.com/gms76575/simplearch2.git
类图: