如何构建复杂的Android数据库

时间:2013-11-18 14:23:54

标签: java android sqlite

构建大型Android数据库的最佳做法是什么?从我到目前为止看到的关于这个主题的一些研究,我发现大多数人都在使用DatabaseHelper,它扩展了SQLiteOpenHelper。当您有多个表时,这是否也适用?

例如,在我目前的项目中,我有大约30个表。到目前为止,我的所有表都是在我的DatabaseHelper类中创建的,目前这个类非常庞大。对于每个模块,我还有一个(类)Source类,它具有该模块中的所有CRUD方法,并且正在使用我的DatabaseHelper类的单例实例。

在我的DatabaseHelper类中拥有所有代码在某种程度上感觉不自然。我是以正确的方式完成的,还是有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

我建议通过像Squirell这样的DB-Client或其他东西生成数据库。然后,您可以通过应用程序的assets文件夹将数据库部署到您的应用程序。

看看这个thread

答案 1 :(得分:0)

我采取了以下方法,有助于分担责任。首先,从一个抽象的数据库适配器开始。它的职责是管理对数据库的访问,创建表(如果需要),处理升级等。它不提供对任何表的访问。

public abstract class DBAdapter {
    private static final String DATABASE_NAME = "database.db";
    private static final int DATABASE_VERSION = 1;
    protected final Context context;
    protected SQLiteDatabase database;
    private DatabaseManager databaseManager;

    private static class DatabaseManager extends SQLiteOpenHelper
    {
        private static final String CREATE_TABLE_PERSON = "create table ...";
        //define other tables here

        DatabaseManager(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_PERSON);
            //create other tables here
        }
    }

    public DBAdapter(Context aContext)
    {
        context = aContext;
    }

    public DBAdapter open() throws SQLException {
        if (databaseManager == null)
        {
            databaseManager = new DatabaseManager(context);
        }

        database = databaseManager.getWritableDatabase();
        return this;
    }

    public void close() {
        databaseManager.close();
    }

}

然后,为每个表提供DBAdapter的实现。它提供对表和列定义的访问。或者,您也可以为需要执行的每个多表连接创建DBAdapter实现。此类为此类访问(表或多表连接)提供创建/读取/更新/删除(CRUD)功能。

public class PersonAdapter extends DBAdapter
{
    static final String COLUMN__ID = "_id";

    static final String TABLE_PERSON = "Person";
    static final String COLUMN_DATE_OF_BIRTH = "DateOfBirth";
    static final String COLUMN_SURNAME = "Surname";
    //etc.

    public PersonAdapter(Context aContext) {
        super(aContext);
    }

    public long deletePerson(long personId)
    {
        open();
        long numberRowsDeleted = 
            database.delete(TABLE_PERSON, COLUMN__ID + "=" + personId, null);
        close();
        return numberRowsDeleted;
    }

    //your other Person CRUD methods go here
}