Android多个数据库打开

时间:2010-12-21 11:19:33

标签: sql android database sqlite

我正在为Android创建一个IM客户端,我正在使用数据库来存储联系人和其他信息...在我的应用程序中,我有一个活动和一个服务。我需要在服务和活动上同时打开三个数据库。

我使用三个数据库,因为我希望更容易管理数据库,而不会出现写入同步问题。 (据我所知,我需要同步在数据库中写入,因为它可能会崩溃)。

为了同时管理服务和活动中的数据库,我认为DatabaseHelper的单例或静态类可以帮助我......

所以我开始通过在活动中创建两个databasehelper全局对象来进行测试,每个对象打开一个不同的数据库,在运行项目之后我注意到最后打开的数据库在两个对象中都保持打开状态:((为什么会这样?

有人能吸引我,我怎么能做到这一点? 谢谢!

LE:经过更多测试后,我创建了一个数据库helper的静态对象,打开一个服务,从中我从活动中获取数据库对象,同时我创建了两个for语句,一个在activity中,另一个在服务中运行0到3000并将一些值添加到同一数据库中,然后读取数据库。

在这次运行之后,我注意到数据库仍处于英尺状态并且运行时没有错误。奇怪的是,只有在完成工作的活动之后,服务才会运行。这是为什么? 谢谢!

1 个答案:

答案 0 :(得分:25)

我有一个DatabaseAdapter类,它包含两个一起打开的数据库。

public class DatabaseAdapter {
    /** Identifier for the internal database */
    public static final int             INTERNAL            = 0;
    /** Identifier for the external database */
    public static final int             EXTERNAL                = 1;

    private final SQLiteOpenHelper[]    mDatabaseManager    = new SQLiteOpenHelper[2];
    private final SQLiteDatabase[]      mDatabases          = new SQLiteDatabase[2];

    /**
     * Constructs the database and open it.
     */
    public DatabaseAdapter() {
        // Open the internal_db
        mDatabaseManager[INTERNAL] = new InternalDatabaseManager(MyApplication.getInstance());
        mDatabases[INTERNAL] = mDatabaseManager[INTERNAL].getWritableDatabase();
    }

    /**
     * Checks the database state and throws an {@link IllegalStateException} if database isn't open.
     * Should always be used before starting to access the database.
     * 
     * @param type Type of the database. Can be INTERNAL or EXTERNAL.
     */
    public void checkDbState(int type) {
        if (mDatabases[type] == null || !mDatabases[type].isOpen()) {
            throw new IllegalStateException("The database has not been opened");
        }
    }

    /**
     * Closes the database of the given type.
     * 
     * @param type Type of the database. Can be INTERNAL or EXTERNAL.
     */
    public void close(int type) {
        if (mDatabases[type].isOpen()) {
            mDatabases[type].close();
            mDatabases[type] = null;
            if (mDatabaseManager[type] != null) {
                mDatabaseManager[type].close();
                mDatabaseManager[type] = null;
            }
        }
    }

    /**
     * @param type Type of the database. Can be INTERNAL or EXTERNAL.
     * @return true if the database is open, false otherwise.
     */
    public boolean isOpen(int type) {
        return mDatabases[type] != null && mDatabases[type].isOpen();
    }

    /**
     * Opens the default database.
     * 
     * @param type Type of the database. Can be INTERNAL or EXTERNAL.
     */
    public void open(int type) {
        switch (type) {
            case INTERNAL:
                mDatabaseManager[INTERNAL] = new InternalDatabaseManager(MyApplication.getInstance());
                if (!isOpen(INTERNAL)) {
                    mDatabases[INTERNAL] = mDatabaseManager[INTERNAL].getWritableDatabase();
                }
            break;
            case EXTERNAL:
                mDatabaseManager[EXTERNAL] = new ExternalDatabaseManager(MyApplication.getInstance(), Constants.EXTERNAL_DB_PATH, 1);
                if (!isOpen(EXTERNAL)) {
                    mDatabases[EXTERNAL] = mDatabaseManager[EXTERNAL].getWritableDatabase();
                }
            break;
        }
    }
}

添加第三个应该很容易:)