我正在努力研究如何在我的Android应用中最好地实现SQLite数据库。来自this答案的建议建议使用我已经拥有的SQLiteOPenHelper,但建议只使用1个实例。
在我的应用程序中,我有一个抽象的BaseDAO类,它扩展了SQLiteOpenHelper并在必要时创建数据库表。 E.g:
public abstract class BaseDAO extends SQLiteOpenHelper{
public BaseDAO(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE " + ...
db.execSQL(CREATE_TABLE);
}
我设置了其他DAO类来访问数据库,这些类都扩展了这个BaseDAO类,例如MessageDAO类,用于将消息对象放入db。
public class MessageDAO extends BaseDAO {
public MessageDAO(Context context) {
super(context, DBContract.DB_NAME, null, DBContract.DB_VERSION);
}
public long addMessage(Message msg) throws Exception {
ContentValues values = new ContentValues();
values.put(DBContract.MessagesTable.COLUMN_TEXT, msg.getText());
values.put(DBContract.MessagesTable.COLUMN_FILE, msg.getFile());
values.put(DBContract.MessagesTable.COLUMN_TYPE, msg.getType());
values.put(DBContract.MessagesTable.COLUMN_TIMESTAMP, msg.getTimeStamp());
SQLiteDatabase db = this.getWritableDatabase();
long rowId = db.insert(DBContract.MessagesTable.TABLE_NAME, null, values);
db.close();
if (!(rowId > 0)) {
throw new Exception("Error inserting message into DB");
}else{
return rowId;
}
}
}
将Contact对象放入db:
的ContactDAO类public class ContactDAO extends BaseDAO {
public ContactDAO(Context context) {
super(context, DBContract.DB_NAME, null, DBContract.DB_VERSION);
}
public long addContact(Contact contact) throws Exception {
ContentValues values = new ContentValues();
values.put(DBContract.ContactTable._ID, contact.getId());
values.put(DBContract.ContactTable.COLUMN_CONTACT_NAME, contact.getContactName());
values.put(DBContract.ContactTable.COLUMN_CONTACT_TYPE, contact.getContactType());
SQLiteDatabase db = this.getWritableDatabase();
long rowId = db.insert(DBContract.ContactTable.TABLE_NAME, null, values);
db.close();
if (rowId <= 0) {
throw new Exception("Error inserting contact into DB");
} else {
return rowId;
}
}
}
我的问题是:我应该重构这个以便将所有DAO类放在一个类中(并使一个类成为单例),或者这个设置通常是否正常?很难找到关于如何在线执行此操作的正确信息,因为似乎有多种方法可以在Android中处理数据库。
答案 0 :(得分:1)
OOP太多了。没有理由所有DAO类都应该从open helperclass 派生。
您的DAO类或多或少与表对应,因此DAO类与数据库对象之间存在N:1关系。 这意味着DAO类应使用开放助手类的公共实例(或者所有内容都应该放在一个类中,但您可能不希望这样)。