欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Architecture Components(2)初识Room

程序员文章站 2022-06-16 16:38:20
...

项目地址https://github.com/gms76575/simplearch2.git

介绍

Room是Google提供的一个ORM库。Room是一个数据持久化库,它是 Architecture Component的一部分。它让SQLiteDatabase的使用变得简单,大大减少了重复的代码,并且把SQL查询的检查放在了编译时。Room提供了三个主要的组件:

  1. @Database:@Database用来注解类,并且注解的类必须是继承自RoomDatabase的抽象类。该类主要作用是创建数据库和创建Daos(data access objects,数据访问对象)。
  2. @Entity:@Entity用来注解实体类,@Database通过entities属性引用被@Entity注解的类,并利用该类的所有字段作为表的列名来创建表。
  3. @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

类图:

Architecture Components(2)初识Room