在我的Android应用程序中,我有各种“实体”,例如用户定义。我正在使用一个具有默认Select
,Insert
,Update
和Delete
功能的DbOperations类。
异步任务用作中介。它位于我的实体和DbOperations类之间,并以异步方式执行所有操作。这是一个例子。
ASYNC CLASS - 使用插入方法代码
private DbResponse InsertUser() {
ContentValues cntValues = GetCrmUserContentVal();
long result = _dbConn.InsertRecord(cntValues, TABLE_NAME);
DbResponse dbResponse = new DbResponse();
if(result == -1)
{
dbResponse.setStatus(false);
}
else {
dbResponse.setStatus(true);
dbResponse.setID(result);
}
return dbResponse;
}
CRM用户实体类 - 插入方法
public void InsertintoDb()
{
new CRMUserDbOperations(this,this,DbOperationType.Insert,getCurrentContext()).execute();
}
DbResponse - 返回类型类是一个单独的类 -
private Boolean Status;
private String ErrorMessage;
private Cursor Data;
private long ID;
private DbOperationType dbOpType;
在异步任务的 doBackground 过程中,我有这个切换代码 -
switch (_DbOpType) { // Enum type.
case Insert:
dbResponse = InsertUser();
break;
case Select:
dbResponse = SelectUser();
break;
case Update:
dbResponse = UpdateUser();
break;
default:
throw new InvalidParameterException(
_Context.getString(R.string.invalid_io));
}
您可以注意到,此异步任务包含我可能必须在实体上执行的所有各种操作的代码。对于其他实体,我也会有相同的结构......
现在我的问题是,我能以更好的方式做到这一点吗?
答案 0 :(得分:2)
是的,它可以以更好的方式完成。让我举一个例子说明我们如何在当前的应用程序中处理它。对于插入,更新,删除和选择操作,您只需要4 AsyncTask
个。我举个例子。
您有一个接口,每个实体都会实现它:
public interface DbOps {
public int delete(String where);
public void insert();
public void update();
public Cursor select();
}
注意:您可以根据自己的需要选择参数和返回类型,但也必须适合每个实体类。我将以delete()
方法为例。
现在,所有权利只需要一个DeleteTask
:
private static class DeleteTask extends AsyncTask<String, Void, Integer> {
private final DbOps mOps;
public RowDeleteTask(DbOps ops) {
mOps = ops;
}
@Override
protected Integer doInBackground(String... wheres) {
String where = wheres[0];
int rowsDeleted = mOps.delete(where);
return rowsDeleted;
}
}
像这样开火:
new DeleteTask(mUserEntity).execute("id = 4");
new DeleteTask(mMoviesEntity).execute("name = x-man");
显然,如果我们以UserEntitiy
为例,你会有类似的东西:
public UserEntity implements DbOps{
@Override
public int delete(String where){
return _dbConn.delete(mTable, where, null);
}
.
.
.
}
答案 1 :(得分:1)
这不是产品展示或任何东西,它是开源的,我一直在研究异步数据库一段时间,并且最近为它创建了一个库。
它在http://fabiancook.github.io/AndroidDbHelper/
的Github上托管它涵盖了对异步数据库使用的更普遍需求,如果需要,您可以做一件事异步,或者整个批次。
我将在未来几个月内实施一个实体框架,因为我正在研究Ubuntu触控版。
只需要询问任何信息。
对于少量对象,实体很棒,但是当你想报告它们时,它们变得非常慢,这在microsofts实体框架中甚至是显而易见的。对于大多数情况来说,以异步方式使用直接SQL通常会更快(性能明智),因为它需要中间对象。
请注意,在android 1.6和3.0之间,AsyncTask
类有时会并行执行,这会导致任何数据库出现问题。因此,当使用这些版本时,您将不得不有一些差异,这正在我的DbHelper中工作:)
http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)