如何使用多个DAO类实现SQLiteOpenHelper

时间:2017-03-25 19:59:46

标签: android sqlite singleton composition sqliteopenhelper

我正在努力研究如何在我的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中处理数据库。

1 个答案:

答案 0 :(得分:1)

OOP太多了。没有理由所有DAO类都应该从open helperclass 派生

您的DAO类或多或少与表对应,因此DAO类与数据库对象之间存在N:1关系。 这意味着DAO类应使用开放助手类的公共实例(或者所有内容都应该放在一个类中,但您可能不希望这样)。