我想在后台任务中执行所有sqlite操作:插入、删除、更新和查询。
我必须为每个操作创建一个扩展AsyncTask的类吗?
我的意思是,最后我有4个类来处理这4个操作?
谢谢。
发布于 2018-03-06 19:45:48
你有没有试过谷歌的房间库,它是一个包装器,并异步工作?
以下是文档和指南:https://developer.android.com/topic/libraries/architecture/room.html
发布于 2021-09-01 20:11:26
房间是一个很好的解决方案。但是如果你想写一些手工代码,你可以这样做:
implementations
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;
}
}public class BankerDAO implements GeneralDAO<Banker, Banker> {
...
}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]);
}
}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();
}
}然后使用它们:
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个类,但它们是泛型任务,您可以将它们用于其他实体
https://stackoverflow.com/questions/49129993
复制相似问题