1

在我的 android 应用程序中,我有各种“实体”,例如用户定义的。我正在使用具有默认SelectInsert和功能Update的单个 DbOperations 类。Delete

异步任务用作中介。它位于我的实体和 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 USER 实体类 - 插入方法

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));
        }

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

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

4

2 回答 2

2

是的,它可以以更好的方式完成。让我举一个例子,说明我们如何在当前应用程序中处理它。插入、更新、删除和选择操作总共只需要 4AsyncTask秒。让我给你举个例子。

你有一个接口,每个实体都会实现它:

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);
    }
    .
    .
    .
}
于 2013-11-12T05:58:50.260 回答
1

这不是产品放置或任何东西,它是开源的,我已经在 Async 数据库上工作了一段时间,并且最近为它创建了一个库。

它托管在 Github 上,地址为http://fabiancook.github.io/AndroidDbHelper/

它涵盖了对异步数据库使用的更普遍需求,您可以根据需要异步执行一件事,也可以全部执行。

它将在接下来的几个月内实现实体框架,因为我目前正在开发 Ubuntu 触摸版本。

任何需要的信息都可以问。

对于少量的对象,实体很棒,但是当你想要报告它们时,它们会变得非常慢,这在微软的实体框架中甚至很明显。大多数情况下,以异步方式使用直接 SQL 通常要快得多(性能方面),因为它不需要中间对象。

请注意,在 android 1.6 和 3.0 之间,AsyncTask该类有时会并行执行,这会在任何数据库中导致一些问题。因此,当使用这些版本时,您可能会有一些差异,这正在我的 DbHelper 中工作:)

http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)

于 2013-11-10T10:49:27.633 回答