你好Stack,我正在开发一个使用Android Room 1.0.0 Alpha 5的Android项目。我遇到的主要问题是每次需要从Room中调用DAO时,我都需要像这样做:
Activity.java:
...
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "Storage").build();
Table1 table = new Table1();
table.setId(1);
table.setName("Hello");
new AccessDB().execute(1);
/* Generic AccessDB needed */
private class AccessDB extends AsyncTask<Integer,Void,List<Table1>> {
@Override
protected List<Table1> doInBackground(Integer... param) {
switch(param[0]) {
case 1:
return db.Table1DAO().create();
case 2:
return db.Table1DAO().read();
}
return new ArrayList<>();
}
@Override
protected void onPostExecute(List<Table1> list) {
processData(list);
}
}
...
我知道我可以从主线程访问Room数据库,并且这会缩小代码,但我认为这不是一个好的实践,因为每次处理数据时都会锁定活动。
所以如果我需要插入或读取“Table2”中的数据,我将不得不再次执行相同的操作,如果我能将实体类型转换为类似于“T”的泛型,然后制作一个通用的“AccessDB”就好了。
但由于我对Java不太熟悉...我目前正在努力解决这个问题。
下面是一些实例的其他代码。
AppDatabase.java:
@Database(entities = {Table1.class, Table2.class, Table3.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract Table1DAO Table1DAO();
public abstract Table2DAO Table2DAO();
public abstract Table3DAO Table3DAO();
}
Table1.java:
@Entity
public class Table1 {
/* setters & getters */
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
}
Table1DAO.java:
@Dao public interface Table1DAO {
@Query("SELECT * FROM Table1")
List<Table1> read(Table1 table);
@Insert(onConflict = OnConflictStrategy.REPLACE)
List<Long> create(Table1... table);
}
感谢大家的帮助。涉及IT技术相关内容。