首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android机房通用DAO

Android机房通用DAO
EN

Stack Overflow用户
提问于 2018-03-16 13:47:44
回答 2查看 6.7K关注 0票数 7

你好,Stack,我正在做一个使用Android的1.0.0 Alpha 5房间的Android项目,我面临的主要问题是每次我需要调用房间中的一个DAO时,我需要这样做:

Activity.java:

代码语言:javascript
复制
...
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 DB,这会缩小代码,但我认为这不是一个好做法,因为这会在每次处理数据时锁定活动。

因此,如果我需要插入或读取"Table2“中的数据,我将不得不再次执行同样的操作,如果我能够将实体类型转换为"T”之类的泛型,然后生成一个通用的"AccessDB“,那就太好了。但既然我对Java不太熟悉..。我目前还在努力解决这个问题。

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

AppDatabase.java:

代码语言:javascript
复制
@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();
}

表1.java:

代码语言:javascript
复制
@Entity
public class Table1 {
    /* setters & getters */
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
}

Table1DAO.java:

代码语言:javascript
复制
@Dao public interface Table1DAO {
    @Query("SELECT * FROM Table1")
    List<Table1> read(Table1 table);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    List<Long> create(Table1... table);
}

谢谢你们的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-18 10:48:56

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

代码语言:javascript
复制
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)
}

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

给弗洛丽娜的原始学分。

票数 8
EN

Stack Overflow用户

发布于 2019-11-25 14:01:41

我对Akshay的回答有点兴趣,但我需要增加两点:

  • 能够插入/更新列表
  • 返回值以监视插入/更新成功

以下是我想出的:

代码语言:javascript
复制
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Update

/**
 * List of all generic DB actions
 * All use suspend to force kotlin coroutine usage, remove if not required
 */
@Dao
interface BaseDao<T> {

    // insert single
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(obj: T?): Long

    // insert List
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(obj: List<T>?) : List<Long>

    // update List
    @Update
    suspend fun update(obj: List<T>?): Int

}
代码语言:javascript
复制
@Dao
interface MyObjectDao : BaseDao<MyObject> {

    @Query("SELECT * from $TABLE_NAME WHERE $COL_ID = :id")
    suspend fun getById(id: Long): MyObject

}

这样就可以称为:

代码语言:javascript
复制
val ids = MyObjectDao.insert(objectList)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49322313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档