Android 异步任务中DbOperations的正确实现

Android 异步任务中DbOperations的正确实现,android,android-asynctask,Android,Android Asynctask,在我的android应用程序中,我有各种实体,比如用户定义的。我使用的是一个DbOperations类,它具有默认的选择、插入、更新和删除功能 异步任务用作中介。它位于实体和DbOperations类之间,异步执行所有操作。这里有一个例子 异步类-带有插入方法代码 CRM用户实体类-插入方法 DbResponse-返回类型类是一个单独的类- private Boolean Status; private String ErrorMessage; private Cursor Data; priv

在我的android应用程序中,我有各种实体,比如用户定义的。我使用的是一个DbOperations类,它具有默认的选择、插入、更新和删除功能

异步任务用作中介。它位于实体和DbOperations类之间,异步执行所有操作。这里有一个例子

异步类-带有插入方法代码

CRM用户实体类-插入方法

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));
        }
正如您所注意到的,这个异步任务包含我可能必须在实体上执行的所有各种操作的代码。对于其他实体,我也会有相同的结构


现在我的问题是,我能以更好的方式来做吗?

这不是植入式广告或其他什么,它是开源的,我已经在异步数据库上工作了一段时间,最近为它创建了一个库

它位于Github上的

它涵盖了异步数据库使用的一个更一般的需求,如果您愿意,您可以做一件异步的事情,也可以做整件事情

在接下来的几个月里,它将实现一个实体框架,因为我现在正在开发一个Ubuntu touch版本

任何需要的信息都可以问

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

注意,在Android1.6和3.0之间,AsyncTask类有时会并行执行,这会在任何数据库中造成一些问题。因此,在使用这些版本时,您可能会发现一些差异,这是在我的DbHelper中实现的:


是的,可以用更好的方法来做。让我举一个例子,说明我们在当前应用程序中如何处理它。插入、更新、删除和选择操作总共需要4个异步任务。让我给你举个例子

您有一个接口,每个实体都将实现它:

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;
    }
}
很明显,如果我们以UserEntitiy为例,你会得到类似的结果:

public UserEntity implements DbOps{

    @Override
    public int delete(String where){
       return _dbConn.delete(mTable, where, null);
    }
    .
    .
    .
}

这可能对你将来有用。我刚刚进入实体now@FabianCook,该链接信息丰富,谢谢!它的基础部分已经完成,文档解释了如何使用它等等。它的实体部分正在它上面构建。@FabianCook,你能在GitHub上托管它吗?已经,等等,将为你提供当前问题的链接,@M-WaJeEh建议的结构更合适。但是谢谢。我将继续关注你的库。实际上,你应该在所有四个库中使用一个,在大多数版本的android中,它一次只运行一个,不管怎样,为什么要创建不必要的对象呢?
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");
public UserEntity implements DbOps{

    @Override
    public int delete(String where){
       return _dbConn.delete(mTable, where, null);
    }
    .
    .
    .
}