0

我有幾個問題,我開始懷疑我的路徑是否正確...將圖標存儲爲blob並向內容提供商回顧它們是個好主意嗎?

我想根據時間安排測量處理器使用情況,列出最常用的應用程序。我知道如何獲取使用情況統計信息和進程名稱,我知道如何將它與應用程序名稱和圖標連接起來。我不知道接下來要做什麼。

我的想法是創建兩個表:PROCESSESPROCESS_STATS,將所有信息存儲在數據庫中,並提供與SimpleCursorAdapter鏈接的ContentProvider。在我看來,這是在Android上使用SQLiteDB時最乾淨的解決方案。不要將計算效應計入一些「真實」的統計數據,這裏不是這種情況。

問題:

  1. 我不能與它的blob創建表。 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);   

    } 

} 

回答

0

對於未來的用戶:

我結束了這樣的解決方案:

我不保存在數據庫中的應用程序信息。我只有一個表格,process_stats,其中我存儲了測量結果。當查看結果時,我通過coursor手動循環並計算所需的一切。接下來,我加載應用程序圖標和應用程序名稱等詳細信息並查看列表。

我可以在這裏粘貼一些示例代碼。如果感興趣,請評論這個答案。

1

也許你第一次創建你的表沒有app_icon字段,然後編輯您的CREATE TABLE語句添加app_icon領域。在這種情況下,它仍然是您將要讀取的舊錶,因此它沒有app_icon字段。

最簡單的,然後將卸載您的應用程序,並重新安裝一次。

或者您可以增加您的數據庫版本,在這種情況下,將調用SQLitehelper.onUpgrade(),您可以刪除或重新構建其中的所有表格。

至於保存圖像將它們保存在SD上並保持它們的文件路徑在DB中是好的。在數據庫中保存圖像不太好,因爲我認爲總圖像大小有限制。

+0

我總是增加數據庫版本或卸載我的應用程序,所以不是這樣。關於最後一段,我熟悉我的解決方案的缺點。這就是爲什麼我正在尋找一個更好的。爲了我的辯護,它只是應用程序的圖標,所以它的大小並不是那麼大。此外,這非常方便,我不確定是否因爲它不是一個好的設計模式而離開它。 – Moyshe

+0

儘管您確實增加了數據庫版本,但是,您可能從未升級過onUpgrade()中的數據庫結構或重新安裝? –

+0

那麼,我在我的數據庫類的onCreate()或onUpgrade()方法中放入LogCat中的一些信息,所以我確信它已創建。 – Moyshe