如何异步有效地处理SQLite DB Android中的多个实体

时间:2017-01-11 14:08:40

标签: java android multithreading sqlite android-asynctask

我目前正在开发一个需要使用Android和SQLite作为后端的项目。我看过互联网,有一些例子,有超过1个表。但是,我已经规范化了我的数据库结构,并且有25个表可以使用。我所做的是创建一些类以试图减少代码中的混乱(这些示例似乎都将它们的设置代码放入一个类中,这对我的情况来说不是很容易维护)。所有实体都有一个Schema(定义表结构),model(定义对象的外观)和Dao(通过从关联表中创建模型来促进数据传输)例如,我有一个名为Project的实体: / p>

ProjectSchema.java

public class ProjectSchema implements Schema {

    public ProjectSchema() {
    }

    public static final String TABLE_NAME = "PROJECT";

    public static final String COL_OWNERID = "USER_ID";
    public static final String COL_PROJID = "_PROJECT_ID"; // PK
    public static final String COL_PROJ_NAME = "PROJECT_NAME";
    public static final String COL_OWNER_NAME = "OWNER_NAME";
    public static final String COL_LOCATION_ID = "LOCATION_ID";
    public static final String COL_START_DATE = "START_DATE";

    @Override
    public String createTableQuery() {
        return "CREATE TABLE " + TABLE_NAME +
            " (" +
            COL_PROJID + " TEXT PRIMARY KEY, " +
            COL_PROJ_NAME + " TEXT, " +
            COL_OWNERID + " TEXT, " +
            COL_OWNER_NAME + " TEXT, " +
            COL_LOCATION_ID + " TEXT, " +
            COL_START_DATE + " INTEGER, " +
            ")";
    }

    @Override
    public String dropTableQuery() {
        return "DROP TABLE IF EXISTS " + TABLE_NAME;
    }
}

Project.java

public class Project implements Model {

    private String projName;
    private long startDate;
    private String owner;
    private String userID;
    private String projectID; 
    private String locationId;

    //--- Constructors, and getters -- //
}

ProjectDao.java

public class ProjectDao implements Dao {

private static ProjectDao instance;

private ProjectDao() {

}

public static ProjectDao getInstance() {
    if (instance == null) {
        instance = new ProjectDao();
    }
    return instance;
}
@Override
public synchronized List<Model> findAll(Context context, String id) {
    return findAllProjectsyId(id);
}

@Override
public synchronized Model findOne(Context context, String id) {
    return getProjectFromId(id);
}

@Override
public synchronized void insert(Context context, Model model) {

}

@Override
public synchronized void update(Context context, Model model) {

}

@Override
public synchronized void delete(Context context, Model model) {

}

我遇到的主要问题是如何从数据库中处理这些模型的延迟加载。虽然有asynctask,但我认为它不适合屏幕旋转。但是,当前的“最佳实践”是使用非UI保留的片段实例来维护此博客http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html所描述的任务。但是,我觉得这会大大增加需要编写的代码量,因为每个模型的每个操作都有一个任务。但是,我试图通过创建一个返回指定Dao实例的DaoFactory来绕过这个。

DaoFactory.java

public class DaoFactory {

public enum DaoFactoryEnum {
    PROJECTS, USERS
}

public DaoFactory() {
}

public Dao createDao(DaoFactoryEnum factoryConst){

    switch (factoryConst) {
        case PROJECTS : return ProjectDao.getInstance();
        case USERS : return UserDao.getInstance();
    }

    return null;
}
}

Dao.java

public interface Dao {
    List<Model> findAll(Context context, String id);
    Model findOne(Context context, String id);
    void insert(Context context, Model model);
    void update(Context context, Model model);
    void delete(Context context, Model model);
}

然而,为了实现这一点,我觉得我被迫为Dao的每个操作制作一个非UI片段(活动中的回调方法将变得忙碌!)和标记接口称为Model so我可以从Asynctask返回它们。对我来说,这感觉非常hacky,不可维护。有没有其他可能的方法来重新设计或使用某种类型的库,它有很好的屏幕旋转支持?

进一步澄清: - 我将Daos从工厂传递到非ui片段,并在那里进行检索。

0 个答案:

没有答案