Как заполнить одно текстовое представление общей суммой столбца БД с помощью contentprovider - PullRequest
1 голос
/ 02 ноября 2011

Что за вопрос! Чтобы описать это более четко: Я использую фрагменты, и моя цель состоит в том, чтобы иметь TextView, который показывает общую сумму столбца таблицы базы данных. Эта общая сумма должна обновляться каждый раз, когда таблица обновляется различными способами (удаление, вставка, обновление). Без контентпровайдера я бы написал метод в своем классе DBHelper, который бы возвращал значение. Но проблема начинается. Это действительно трудно (пока невозможно) фрагментами, чтобы обновить текстовое представление программно. Поэтому мне нравится использовать контент-провайдера, потому что он всегда информирует мои списки об изменениях без какой-либо дополнительной работы с моей стороны. В этом случае (contentprovider) я должен (imho) использовать методы загрузчика onCreateLoader () и onLoadFinished () с курсором загрузки и URI. Но все они возвращают объект курсора, и это ничего, что я могу прикрепить к этому единственному текстовому обзору. После всех дней работы над просмотрами списков и контент-провайдерами мое мышление, возможно, слишком «широкоизображено», так что я не могу увидеть простое решение для простого просмотра текста. Если есть ...

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

Я нашел один, по крайней мере, обходной путь. Буду признателен, если кто-нибудь знает лучшее решение.

Чтобы использовать Loader, вы должны переопределить 3 метода:

  • onCreateLoader (int id, Bundle arg1)
  • onLoadFinished (загрузчик загрузчика, курсор курсора) и
  • onLoaderReset (загрузчик arg0)

Итак, скажем, у нас есть один телевизор TextView, который должен обновляться через ContentProvider.

in onCreateLoader () :

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        String select = "where _id="+id; //id is definied earlier in this program
        loader = new CursorLoader(getActivity(),
                MaterialContentProvider.READ_SINGLE_MATSTAMM_URI, null, select, null, null);
    }
    return loader;
}

MaterialContentProvider.READ_SINGLE_MATSTAMM_URI - это мой URI, который показывает ContentProvider, какую таблицу БД использовать и как. В этом случае я получу единственный результат. Это мы получим асинхронно через onLoadFinished () и вот мой обходной путь:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

     final TextView tv = (TextView) View.findViewById(R.id.mytextview);
     tv.setText(cursor.getString(cursor.getColumnIndex("myColumn")));
}

С этого момента ваш текстовый телевизор будет обновляться каждый раз, когда содержимое меняется в таблице, на которую нацелен URI в onCreateLoader (). «Хитрость» заключается в том, чтобы не отдавать курсор, как вы это обычно делаете (с чем-то вроде «adapter.swap (cursor)»), потому что нет ничего с адаптером. Чтобы получить общую сумму столбца, вы должны получить все строки этого специального столбца с помощью курсора (что означает, что у вас другой URI).

0 голосов
/ 15 июля 2012

Я использовал подход, показанный здесь . По сути, вы должны Handler отправить строку из Cursor в пользовательский интерфейс. И вам также нужно перейти к первой Cursor -позиции:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    if (cursor.moveToFirst()) {
        final String text =  cursor.getString(cursor.getColumnIndex(""myColumn));
        final TextView tv = (TextView) View.findViewById(R.id.mytextview);
        handler.post(new Runnable() {
            public void run() {
                tv.setText(text);
            }
        });
    }
}

И не забывайте, что вы должны очистить интерфейс при сбросе Cursor.

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    final TextView tv = (TextView) View.findViewById(R.id.mytextview);
    handler.post(new Runnable() {
        public void run() {
            tv.setText("");
        }
    });
}
...