首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlite CRUD-4个类中的操作扩展Asynctask?

Sqlite CRUD-4个类中的操作扩展Asynctask?
EN

Stack Overflow用户
提问于 2018-03-06 19:41:36
回答 2查看 127关注 0票数 1

我想在后台任务中执行所有sqlite操作:插入、删除、更新和查询。

我必须为每个操作创建一个扩展AsyncTask的类吗?

我的意思是,最后我有4个类来处理这4个操作?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-03-06 19:45:48

你有没有试过谷歌的房间库,它是一个包装器,并异步工作?

以下是文档和指南:https://developer.android.com/topic/libraries/architecture/room.html

票数 1
EN

Stack Overflow用户

发布于 2021-09-01 20:11:26

房间是一个很好的解决方案。但是如果你想写一些手工代码,你可以这样做:

implementations

  • Create泛型任务和
  1. 创建泛型DAO扩展了AsyncTask。例如:

代码语言:javascript
复制
public interface GeneralDAO<O, I> extends Serializable {
    default O findById(long k) {
        SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();

        Cursor cursor = db.query(getTableName(), null, getColumnId() + " = ?",
                new String[]{String.valueOf(k)}, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        O t = map(cursor);
        cursor.close();
        Log.i(getTag(), "findById " + k + ": " + t);
        DatabaseManager.getInstance().closeDatabase();
        return t;
    }

    default List<O> getAll() {
        List<O> lst = new ArrayList<>();
        Log.i(getTag(), "getAll ... ");
        String selectQuery = "SELECT  * FROM " + getTableName();
        SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        if (cursor != null && cursor.moveToFirst()) {
            do {
                O t = map(cursor);
                if (t != null) {
                    lst.add(t);
                }
            } while (cursor.moveToNext());
        }
        cursor.close();
        DatabaseManager.getInstance().closeDatabase();
        return lst;
    }

}
代码语言:javascript
复制
public class BankerDAO implements GeneralDAO<Banker, Banker> {
    ...
}
代码语言:javascript
复制
public class CreateTask<O, I> extends AsyncTask<I, Void, Long> {

    protected GeneralDAO<O, I> dao;
    protected ProgressBar progressBar;

    public CreateTask(ProgressBar progressBar, GeneralDAO<O, I> dao) {
        this.progressBar = progressBar;
        this.dao = dao;
    }

    @Override
    protected Long doInBackground(I... ins) {
        return dao.add(ins[0]);
    }
}
代码语言:javascript
复制
public class GetAllTask<O, I> extends AsyncTask<I, Void, List<O>> {

    protected GeneralDAO<O, I> dao;
    protected ProgressBar progressBar;

    public GetAllTask(ProgressBar progressBar, GeneralDAO<O, I> dao) {
        this.progressBar = progressBar;
        this.dao = dao;
    }

    @Override
    protected List<O> doInBackground(I... ins) {
        return dao.getAll();
    }
}

然后使用它们:

代码语言:javascript
复制
public class BankerViewModel extends ViewModel {
    private static final String TAG = "BankerViewModel";
    private BankerDAO bankerDAO;
    private MutableLiveData<List<Banker>> bankers;

    public BankerViewModel() {
        bankers = new MutableLiveData<>();
        bankerDAO = DAOFactory.getBankerDAO();
        try {
            bankers.setValue(new GetAllTask<Banker, Banker>(null, bankerDAO).execute().get());
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }

    public void addBanker(Banker banker) {
        try {
            Banker newBanker = new CreateAndGetTask<Banker, Banker>(null, bankerDAO).execute(banker).get();
            System.out.println("addBanker addAndGetNewInstance:" + newBanker.info());
            if (newBanker != null) {
                bankers.getValue().add(banker);
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage(), e);
        }
    }
}

使用此解决方案,您仍然可以为CRUD任务创建4个类,但它们是泛型任务,您可以将它们用于其他实体

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49129993

复制
相关文章

相似问题

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