У меня есть несколько проблем, и я начинаю задумываться, верен ли мой путь ...
Я хотел бы составить список наиболее часто используемых приложений на основе запланированных измерений времени использования процессора. Я знаю, как получить статистику использования и имена процессов, я знаю, как связать ее с именами приложений и значками. Чего я не знаю, так это что делать дальше.
Моя идея состояла в том, чтобы создать две таблицы: PROCESSES
И PROCESS_STATS
, сохранить всю информацию в базе данных и предоставить ContentProvider, связанный с SimpleCursorAdapter. На мой взгляд, это самое чистое решение при работе с SQLiteDB на Android. Не пытайтесь подсчитать эффекты в какой-то «реальной» статистике, здесь дело не в этом.
Проблемы:
- Я не могу создать таблицу с блобом. Код в
listing 1
не работает. Когда я пытаюсь читать из таблицы (используя код из Listing 2
), я получаю java.lang.IllegalArgumentException: column 'app_icon' does not exist
. В LogCat нет ошибок при создании БД.
- Хранение значков (растровых изображений) в БД - не очень хороший шаблон проектирования. Однако мне нравится простота моего решения: 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);
}
}