我有幾個問題,我開始懷疑我的路徑是否正確...將圖標存儲爲blob並向內容提供商回顧它們是個好主意嗎?
我想根據時間安排測量處理器使用情況,列出最常用的應用程序。我知道如何獲取使用情況統計信息和進程名稱,我知道如何將它與應用程序名稱和圖標連接起來。我不知道接下來要做什麼。
我的想法是創建兩個表:PROCESSES
和PROCESS_STATS
,將所有信息存儲在數據庫中,並提供與SimpleCursorAdapter鏈接的ContentProvider。在我看來,這是在Android上使用SQLiteDB時最乾淨的解決方案。不要將計算效應計入一些「真實」的統計數據,這裏不是這種情況。
問題:
- 我不能與它的blob創建表。
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);
}
}
我總是增加數據庫版本或卸載我的應用程序,所以不是這樣。關於最後一段,我熟悉我的解決方案的缺點。這就是爲什麼我正在尋找一個更好的。爲了我的辯護,它只是應用程序的圖標,所以它的大小並不是那麼大。此外,這非常方便,我不確定是否因爲它不是一個好的設計模式而離開它。 – Moyshe
儘管您確實增加了數據庫版本,但是,您可能從未升級過onUpgrade()中的數據庫結構或重新安裝? –
那麼,我在我的數據庫類的onCreate()或onUpgrade()方法中放入LogCat中的一些信息,所以我確信它已創建。 – Moyshe