构建大型Android数据库的最佳做法是什么?从我到目前为止看到的关于这个主题的一些研究,我发现大多数人都在使用DatabaseHelper,它扩展了SQLiteOpenHelper。当您有多个表时,这是否也适用?
例如,在我目前的项目中,我有大约30个表。到目前为止,我的所有表都是在我的DatabaseHelper类中创建的,目前这个类非常庞大。对于每个模块,我还有一个(类)Source类,它具有该模块中的所有CRUD方法,并且正在使用我的DatabaseHelper类的单例实例。
在我的DatabaseHelper类中拥有所有代码在某种程度上感觉不自然。我是以正确的方式完成的,还是有更好的方法来做到这一点?
答案 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
}