在Async Task中正确实现DbOperations

时间:2013-10-29 03:58:37

标签: android android-asynctask

在我的Android应用程序中,我有各种“实体”,例如用户定义。我正在使用一个具有默认SelectInsertUpdateDelete功能的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));
        }

您可以注意到,此异步任务包含我可能必须在实体上执行的所有各种操作的代码。对于其他实体,我也会有相同的结构......

现在我的问题是,我能以更好的方式做到这一点吗?

2 个答案:

答案 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...)