Является ли хорошей идеей хранение значков в виде больших двоичных объектов и получение их у поставщиков контента? - PullRequest
0 голосов
/ 23 ноября 2011

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

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

Моя идея состояла в том, чтобы создать две таблицы: PROCESSES И PROCESS_STATS, сохранить всю информацию в базе данных и предоставить ContentProvider, связанный с SimpleCursorAdapter. На мой взгляд, это самое чистое решение при работе с SQLiteDB на Android. Не пытайтесь подсчитать эффекты в какой-то «реальной» статистике, здесь дело не в этом.

Проблемы:

  1. Я не могу создать таблицу с блобом. Код в listing 1 не работает. Когда я пытаюсь читать из таблицы (используя код из Listing 2), я получаю java.lang.IllegalArgumentException: column 'app_icon' does not exist. В LogCat нет ошибок при создании БД.
  2. Хранение значков (растровых изображений) в БД - не очень хороший шаблон проектирования. Однако мне нравится простота моего решения: ContentProvider, SimpleCursorAdapter и Fragments делают всю фоновую работу за меня. Если бы я хотел хранить значки на SD, у меня было бы гораздо больше работы, особенно с окончательным списком приложений. Каковы другие способы сделать это безболезненно?

Листинг 1:

CREATE TABLE processes
    (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT NOT NULL, 
    app_name TEXT, 
    app_icon BLOB); 

CREATE TABLE process_stats 
    (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    process_id INTEGER NOT NULL, 
    FOREIGN KEY(process_id) REFERENCES processes(_id), 
    value INTEGER NOT NULL, 
    measurment_date INTEGER NOT NULL); 

Листинг 2:

...
import android.support.v4.widget.SimpleCursorAdapter;
...

public class ProcessesStatsActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Cursor cursor = this.managedQuery(StatsProvider.PROCESSES_CONTENT_URI, null, null, null, null);
        String[] columns = new String[] { StatsCollectorDatabase._PROCESS_APP_ICON, StatsCollectorDatabase._PROCESS_APP_NAME, StatsCollectorDatabase._PROCESS_STAT_VALUE };
        int[] views = new int[] { android.R.id.icon, android.R.id.text1, android.R.id.text2 };      

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this.getApplicationContext(), R.layout.processes_stats_list_item, cursor, columns, views, 0);
        this.setListAdapter(adapter);        

    }

}  

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Возможно, вы сначала создали свою таблицу без поля app_icon, а затем отредактировали оператор CREATE TABLE, добавив поле app_icon.В этом случае это все еще старая таблица, из которой вы будете читать, и, следовательно, у нее нет поля app_icon.

Простейшим будет удаление приложения и его повторная установка.

ИлиВы можете увеличить версию своей БД, в этом случае будет вызываться SQLitehelper.onUpgrade(), и вы можете удалить или реструктурировать все находящиеся там таблицы.

Что касается сохранения изображений, сохранение их на SD и сохранение их путей к файлам в БД - это хорошо,Хранение изображений в БД не очень хорошо, потому что я думаю, что есть ограничение на общий размер изображения.

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

Для будущих посетителей:

У меня получилось такое решение:

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

Я могу вставить пример кода здесь. Прокомментируйте этот ответ, если вы заинтересованы.

...