Работа с базами данных в Android? - PullRequest
2 голосов
/ 03 июня 2011

У меня есть база данных в моем приложении, и когда мне нужно что-то вставить или удалить, мне, конечно, нужно открыть базу данных. Я делаю это каждое действие, так что это означает, что я открываю базу данных, даже если она открыта. В DDMS я получаю: «Утечка найдена». Что я должен сделать, чтобы открыть свою базу данных только один раз? Должен ли я использовать одноэлементный класс?

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Да, Singleton - лучший вариант.Вы можете использовать общий экземпляр для доступа к базе данных.Если вы хотите поделиться БД с внешними действиями, то выберите поставщика контента.

0 голосов
/ 15 февраля 2012

Это была проблема для меня, когда я только начинал с Android, так как в Интернете не так много учебников, в которых описывается, как правильно разрешить доступ к вашей базе данных во всем приложении (не спрашивайте меня, почему).Вот пример кода, который демонстрирует три возможных подхода.

Подход № 1: создание подкласса `Application`

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

public class MainApplication extends Application {

    /**
     * see NotePad tutorial for an example implementation of DataDbAdapter
     */
    private static DataDbAdapter mDbHelper;

    /**
     * create the database helper when the application is launched 
     */
    @Override
    public void onCreate() {
        mDbHelper = new DataDbAdapter(this);
        mDbHelper.open();
    }

    /** 
     * close the database helper when the application terminates.
     */
    @Override
    public void onTerminate() {
        mDbHelper.close();
        mDbHelper = null;
    }

    public static DataDbAdapter getDatabaseHelper() {
        return mDbHelper;
    }
}

Подход № 2: пусть `SQLiteOpenHelper` будет статическим членом данных

Это неполная реализация, но она должна дать вам хорошее представление о том, как правильно проектировать класс DatabaseHelper.Метод статической фабрики гарантирует, что в любое время существует только один экземпляр DatabaseHelper.

/**
 * create custom DatabaseHelper class that extends SQLiteOpenHelper
 */
public class DatabaseHelper extends SQLiteOpenHelper { 
    private static DatabaseHelper mInstance = null;

    private static final String DATABASE_NAME = "databaseName";
    private static final String DATABASE_TABLE = "tableName";
    private static final int DATABASE_VERSION = 1;

    private Context mCxt;

    public static DatabaseHelper getInstance(Context ctx) {
        /** 
         * use the application context as suggested by CommonsWare.
         * this will ensure that you dont accidentally leak an Activitys
         * context (see this article for more information: 
         * http://developer.android.com/resources/articles/avoiding-memory-leaks.html)
         */
        if (mInstance == null) {
            mInstance = new DatabaseHelper(ctx.getApplicationContext());
        }
        return mInstance;
    }

    /**
     * constructor should be private to prevent direct instantiation.
     * make call to static factory method "getInstance()" instead.
     */
    private DatabaseHelper(Context ctx) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.mCtx = ctx;
    }
}

Подход № 3: абстрагируйте базу данных SQLite с помощью `ContentProvider`

Это подход, который я хотел быпредложить.Во-первых, новый класс LoaderManager в значительной степени зависит от ContentProviders, поэтому, если вы хотите, чтобы Activity или Fragment реализовали LoaderManager.LoaderCallbacks<Cursor> (который я предлагаю вам использовать, это волшебно!), Вам нужно реализовать ContentProvider для вашего приложения.Кроме того, вам не нужно беспокоиться о создании помощника базы данных Singleton с помощью ContentProviders.Просто позвоните getContentResolver() из Упражнения, и система позаботится обо всем за вас (другими словами, нет необходимости разрабатывать шаблон Singleton для предотвращения создания нескольких экземпляров).

Надежда, которая помогает!

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