Android несколько баз данных открыты - PullRequest
13 голосов
/ 21 декабря 2010

Я делаю IM-клиент для Android и работаю с базами данных для хранения контактов и другой информации ... В моем приложении есть активность и один сервис.Мне нужно одновременно открыть три базы данных как для службы, так и для операции.

Я использую три базы данных, потому что хочу, чтобы базы данных управлялись более легко, без проблем с синхронизацией записи в них.(насколько я знаю, мне нужно синхронно писать в базу данных, потому что она может сломаться).

Для управления базами данных из службы и из активности в одно и то же время я подумал, что одноэлементный или статическийкласс DatabaseHelper мог бы помочь мне ...

Итак, я начал делать тест, создав два глобальных объекта databasehelper в упражнении, каждый из которых открывает свою базу данных, после запуска проекта я заметил, чтопоследняя открытая база данных остается открытой в обоих объектах: ((, почему это происходит?

Может кто-нибудь подсказать мне, как я могу сделать эту работу? Спасибо!

LE: после дополнительных тестов ясделал статический объект databasehelper, откройте сервис, из которого я беру объект базы данных из действия, и в то же время я сделал два для операторов, один в действии и один в сервисе, который работает от 0 до 3000 и добавляет некоторые значения в тот жебазы данных, а затем он читает базу данных.

После этого запуска я заметил, что база данных все еще в ногахи работает без ошибок.Странно то, что служба для запускается только после того, как действие завершает работу.Это почему?Спасибо!

1 Ответ

25 голосов
/ 21 декабря 2010

У меня есть класс 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;
        }
    }
}

добавить третий должно быть просто:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...