我目前正在开发一个需要使用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片段,并在那里进行检索。