因实例化room消耗极大,因此调用room时应使用单例模式。
首先创建一个抽象类继承与RoomDatabase,并在其中指定model文件及数据库版本。
在java中需要加入exportSchema = false,而在kotlin中不用添加
@Database(entities = {LoginInfo.Data.class}, version = 1, exportSchema = false) public abstract class LoginInfoDatabase extends RoomDatabase { public abstract LoginInfoDao loginInfoDao(); }
|
创建一个接口就可以在其中实现增删改查方法,在此接口前需添加@Dao以指定其为数据库的Dao
@Dao public interface LoginInfoDao {
@Insert void insertLoginInfo(LoginInfo.Data data);
@Query("SELECT * FROM loginData WHERE rowId = 1") LiveData<LoginInfo.Data> getLoginInfo();
@Query("SELECT token FROM loginData WHERE rowId = 1") String getToken();
@Query("DELETE FROM loginData") void deleteLoginInfo();
}
|
接着创建一个单例DBHelper类以获取db对象
public class DBHelper { private static final DBHelper instance = new DBHelper(); private static final String DATABASE_NAME = "db_cache";
private DBHelper() { }
public static DBHelper getInstance() { return instance; }
private LoginInfoDatabase mLoginInfoDatabase;
public void init(Context context) { mLoginInfoDatabase = Room.databaseBuilder(context.getApplicationContext(), LoginInfoDatabase.class, DATABASE_NAME) .allowMainThreadQueries() .build(); }
public LoginInfoDatabase getDb() { return mLoginInfoDatabase; } }
|
其中allowMainThreadQueries()为允许room方法运行在主线程,如不添加则在操作room时需要在非主线程上运行。