Где приложения Android должны вызывать SQLite getWritableDatabase? - PullRequest
9 голосов
/ 09 января 2011

Документация по http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase%28%29 гласит:

Обновление базы данных может занять много времени, вы не должны вызывать этот метод [getWritableDatabase] из основного потока приложения, в том числе из ContentProvider.onCreate ().

Возникает вопрос: для лучшей практики откуда следует вызывать getWritableDatabase?

Мне кажется, что, возможно, ее следует вызывать один раз при запуске приложенияс обратным вызовом, чтобы пометить базу данных как готовую.Это правильно?

Ответы [ 3 ]

4 голосов
/ 09 января 2011

Для небольших и гибких баз данных я думаю, что это не большая проблема.

В противном случае я бы использовал всегда замечательный AsyncTask, который вызывается с onCreate.

2 голосов
/ 11 января 2011

Его можно вызывать из любого места, но его нельзя вызывать из потока пользовательского интерфейса, потому что вы не знаете, сколько времени займет процесс (особенно с использованием различных файловых систем).Даже если вы знаете, что база данных должна быть небольшой, вы не знаете о файловой системе (может ли она выполнять более одной работы одновременно? Есть ли в очереди уже тысячи других работ?).Вы можете использовать AsyncTask или Thread для вызова getWriteableDatabase.

0 голосов
/ 16 ноября 2011

Похоже, что предполагаемое использование каркаса open helper - открыть БД при запуске действия и закрыть его, когда действие уничтожено.

В AsyncTask изнутри onCreate () ...

new StartupTask().execute();

AsyncTask Thread.sleep () ниже просто для того, чтобы дать достаточно времени для отображения диалога, чтобы вы могли видеть, как он работает.Очевидно, убери это, когда закончишь играть.;)

private class StartupTask extends AsyncTask
{

    private ProgressDialog progressDialog;

    @Override
    protected Object doInBackground(final Object... objects)
    {
        openHelperRef.getWritableDatabase();
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        runOnUiThread(new Runnable()
        {
            public void run()
            {
                progressDialog = ProgressDialog.show(
                    MyActivity.this, "Title",
                    "Opening/Upgrading the database, please wait", true);
            }
        });
    }

    @Override
    protected void onPostExecute(Object object)
    {
        super.onPostExecute(object);
        progressDialog.dismiss();
    }

}

в onDestroy () ... openHelper.close ();

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