Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何用多个DAO类实现SQLiteOpenHelper_Android_Sqlite_Singleton_Composition_Sqliteopenhelper - Fatal编程技术网

Android 如何用多个DAO类实现SQLiteOpenHelper

Android 如何用多个DAO类实现SQLiteOpenHelper,android,sqlite,singleton,composition,sqliteopenhelper,Android,Sqlite,Singleton,Composition,Sqliteopenhelper,我正试图找出如何在我的Android应用程序中最好地实现SQLite数据库。来自answer的建议建议使用SQLiteOPenHelper,我已经有了,但建议只使用一个实例 在我的应用程序中,我有一个抽象的BaseDAO类,它扩展了SQLiteOpenHelper,并在必要时创建数据库表。例如: public abstract class BaseDAO extends SQLiteOpenHelper{ public BaseDAO(Context context, String

我正试图找出如何在我的Android应用程序中最好地实现SQLite数据库。来自answer的建议建议使用SQLiteOPenHelper,我已经有了,但建议只使用一个实例

在我的应用程序中,我有一个抽象的BaseDAO类,它扩展了SQLiteOpenHelper,并在必要时创建数据库表。例如:

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类

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;
        }
    }
}
以及一个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中似乎有多种处理db的方法。

太多OOP了。没有理由认为所有DAO类都应该派生自OpenHelperClass

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