Подтвердить что ты не робот

Открывается множество баз данных Android

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

чтобы добавить третий, должно быть легко:)