2014-01-30 24 views
1

老實說,我不知道如何來命名這個問題妥善..使用SQLite查詢把唯一的值到ListView中的「歷史的應用程序」

我有這些列的sqlite的分貝。

private final String createDb = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" 
     + C_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + DATE + " text, " 
     + SUBCAT + " text, " 
     + ITEM + " text, " 
     + PRICE + " integer, " 
     + QUANTITY + " integer, " 
     + WEIGHT + " integer, " 
     + VOLUME + " integer, " 
     + SALE + " text, " 
     + STORE + " text, " 
     + EXTRA + " text) "; 

並試圖使用ViewBinder調用下面的SQL查詢。

public String avgPrice() { 
     ourHelper = new DbHelper(ourContext); 
     db = ourHelper.getReadableDatabase(); 
     String sql = "SELECT AVG(PRICE) as avgprice, ITEM FROM " + TABLE_NAME + " GROUP BY " + ITEM; 
     Cursor d = db.rawQuery(sql, null); 

我原來有一個ListView和一個XML,每個列都包含一個textview。這只是拉1:1關閉數據庫的每列。使用適配器很容易。我正在嘗試使用ViewBinder來檢測每個輸入項目的平均價格(如果存在重複的實例,例如不同的日期),並顯示該項目的平均價格。

本質上,我希望ListView只顯示一個項目(以avg價格),當您選擇它時,您可以查看每個存儲的實例(如歷史記錄)。

從哪裏做到這一點最簡單的方法是什麼? 假設上面可以使用ViewBinder方法(或查詢),我如何提取ITEM and AVG(PRICE)才能將相應視圖放入一次以實現我的「歷史記錄」功能?

+0

下面的RED建議在ITEM上使用UNIQUE。我認爲這是有道理的。 – Clam

+0

如果我製作了一個平均價格欄,我可以使用類似的查詢來查看我必須付出的平均價格嗎?我怎麼會把這個計算? – Clam

+0

獨特的約束不能幫助你。新平均值列的想法是使用sqlite觸發器在您添加新行(使用新價格)時更新列或者當您更新價格以重新計算平均值時(基於新價格)。 – Luksprog

回答

0

以下添加到您的數據庫的創建字符串:

+ "UNIQUE(" + COLUMN_NAME + ") ON CONFLICT REPLACE);"; 

這樣,你將擁有的任何列你想在那裏是唯一的名稱,重複將不會被允許的,如果進入將被取代數據庫兩次。我假設你有一列可以是唯一的。例如,像item_id一樣,只能一次添加其中一個項目,它將顯示最近的ON CONFLICT REPLACE

+0

使用獨特的東西,像我的ITEM欄,以確保只有一個被輸入。那麼其他數據會發生什麼? – Clam

+0

你是什麼意思?它們將按正常方式添加,但基於唯一標識符。 –

+0

是的,我認爲我不太瞭解它的功能。如果該項目是唯一的(只允許該類型的1個值),那麼其他列數據似乎會被覆蓋? – Clam

相關問題