Android Room 通用 DAO

Bas*_* SG 4 java android dao android-asynctask android-room

美好的一天 Stack,我正在开发一个使用 Android Room 1.0.0 Alpha 5 的 Android 项目,我面临的主要问题是每次我需要从房间调用 DAO 之一时,我都需要做一些类似的事情这个:

活动.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);
    }
}
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以从主线程访问 Room DB,这会缩小代码,但我认为这不是一个好习惯,因为这会在每次必须处理数据时锁定活动。

因此,如果我需要从“Table2”插入或读取数据,我将不得不重新做同样的事情,如果我可以将实体类型转换为“T”之类的泛型,然后创建一个泛型,那就太好了“访问数据库”。但由于我对 Java 不太熟悉……我目前正在为此苦苦挣扎。

这是实例的一些其他代码。

应用数据库.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();
}
Run Code Online (Sandbox Code Playgroud)

表1.java:

@Entity
public class Table1 {
    /* setters & getters */
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

表1DAO.java:

@Dao public interface Table1DAO {
    @Query("SELECT * FROM Table1")
    List<Table1> read(Table1 table);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    List<Long> create(Table1... table);
}
Run Code Online (Sandbox Code Playgroud)

谢谢大家的帮助。

Aks*_*iya 6

您可以使用继承并创建一个BaseDao将由您的所有孩子实现的Dao。这样您就不需要一次又一次地编写常用方法。

interface BaseDao<T> {

/**
 * Insert an object in the database.
 *
 * @param obj the object to be inserted.
 */
@Insert
fun insert(obj: T)

/**
 * Insert an array of objects in the database.
 *
 * @param obj the objects to be inserted.
 */
@Insert
fun insert(vararg obj: T)

/**
 * Update an object from the database.
 *
 * @param obj the object to be updated
 */
@Update
fun update(obj: T)

/**
 * Delete an object from the database
 *
 * @param obj the object to be deleted
 */
@Delete
fun delete(obj: T)
}
Run Code Online (Sandbox Code Playgroud)

阅读更多相关信息:https : //gist.github.com/florina-muntenescu/1c78858f286d196d545c038a71a3e864#file-basedao-kt

弗洛丽娜的原始学分。