2013-02-28 66 views
3

我正在使用SQLite數據庫。表格中會持續更新,每次更新1或2個行值。如何在android中更新值更新的特定行

例如:現在有20排在TABLE1一些列的值被更新..

我們可以知道哪個行得到了在TABLE1更新?

我有解決方案,但表現對我很重要。遊標註冊數據觀察員與選擇查詢選擇所有行,當有更新我檢索整個20行的更新值,做我的編碼。因此,如果有100行,我需要循環所有這些對於低端設備來說是一項繁瑣的任務。

請協助解決方法,即如何使用遊標檢索Android中的表中更新的行。

+0

有互聯網上的許多Android開發者的支持網站。你可能會有更好的運氣,用一種對你來說更舒適的語言。我有幾個這樣的網站列在http://www.andglobe.com。 – CommonsWare 2013-03-06 14:39:42

+0

你可以發佈你正在更新數據庫的代碼嗎? – 2013-03-17 18:31:33

回答

9

如果可以改變表格,然後添加TIMESTAMP類型的新列'modified_time'。每當更新一行時更新此列。

現在,當你想知道哪些行得到了更新,運行該SQL查詢:

select _id from table2 where modified_time = (select max(modified_time) from table2)

此查詢的結果給出了得到了更新後的最新的所有行的ID。

編輯: 正如您在您的評論提到「... 服務器的數據推到表改變values.i需要採取更新值和更新到其他表」,最好的選擇適合你是在DB中創建一個觸發器,它將根據第一個表上的更新更新第二個表。這是方法。

假設服務器將數據推送到'table1',並且您想監視更新的行。創建另一個table2(或使用現有的),它會自動更新。

現在,如下創建觸發器:

CREATE TRIGGER trigger1 AFTER UPDATE ON table1 
BEGIN 
    update table2 SET modified_time = datetime('now') WHERE row_id = old._id; 
END; 

當然你將表2不同,但這個想法是,你可以插入或更新表2行自動使用觸發器。你可以參考這些SO崗位瞭解更多詳情:

Does sqlite3 support a trigger to automatically update an 'updated_on' datetime field?

Using SQLite Trigger to update "LastModified" field

示例應用程序: 我創建了一個示例應用程序來演示在Android應用程序中使用觸發器的基礎上,方案你已經描述過了。您可以在這裏下載Eclipse項目 - trigger_example_eclipse_project.zip

簡而言之,示例應用程序有一個產品表可以接收產品價格的更新。所以我們創建另一個更新表將根據更新產品表通過觸發器自動更新。

有一個用戶界面來模擬更新產品表由一個EditText字段和一個按鈕。爲了顯示最近的更新,我們有一個ListView,它使用一個光標從更新表中獲取數據。

這裏是一些相關的代碼片段從DbHelper.java

public class DbHelper extends SQLiteOpenHelper { 

    public static final String TABLE1 = "product"; 
    public static final String TABLE2 = "updates"; 

    public static final String COL_ID = "_id"; 
    public static final String COL_NAME = "name"; 
    public static final String COL_PRICE = "price"; 
    public static final String COL_MODIFIED_TIME = "modified_time"; 

    public static final String KINDLE = "Kindle"; 

    private static final String SQL_CREATE_TABLE1 = 
      "CREATE TABLE product (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER);"; 

    private static final String SQL_CREATE_TABLE2 = 
      "CREATE TABLE updates (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, price INTEGER, modified_time TIMESTAMP);"; 

    private static final String SQL_CREATE_TRIGGER = 
      "CREATE TRIGGER price_update AFTER UPDATE OF price ON product"+ 
      " BEGIN" + 
      "  INSERT INTO updates(name,price,modified_time) VALUES(old.name,new.price,datetime('NOW'));"+ 
      " END;"; 

    public DbHelper(Context context) { 
     super(context, "sampledb", null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_TABLE1); 
     db.execSQL(SQL_CREATE_TABLE2); 
     db.execSQL(SQL_CREATE_TRIGGER); 

     ContentValues cv = new ContentValues(); 
     cv.put(COL_NAME, KINDLE); 
     cv.put(COL_PRICE, 99); 
     db.insert(TABLE1, null, cv); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { 
    } 

} 
+0

對不起,它不是我的問題的答案,我想從數據庫中獲取更新的行值... – Rockin 2013-02-28 17:52:12

+1

請參閱我已編輯的答案。該查詢未優化。也許有更好的方式來編寫查詢。但你明白了。 – appsroxcom 2013-02-28 19:18:32

+0

感謝您的信息...我也有疑問..如果第一行獲取更新pn 11.36(時間),第二行獲取更新11.37。當我發送查詢時,它會得到更新的值或只有11.37。 也抱歉,我不能改變表...因爲服務器將數據推到表中更改values.i需要更新值並更新到其他表.. – Rockin 2013-03-01 02:25:10

3

你可以繼續像LAST_UPDATE_TIME,這是與當前時間更新時更新列。

然後您可以查詢LAST_UPDATE_TIME>所需時間的所有行。

如果你不能改變表格,你可以用同樣的列創建一個新表格嗎?然後,您可以在兩個表中進行更新,並在需要時從新表中獲取值,並在完成後從新表中刪除它們。

1

如果您正確實施ContentProvider,則插入或更新可能會返回該行的標識。

這是一個有點複雜,但看看Google's IOSchedule app審查提供合同類,看看在合同類,並在提供的「房間」案件在插入或更新方法。
您將看到將返回Uri,在此設計方法中,最後一個元素(最後一個斜槓後)是插入/更新行的id

我這種方法可以幫助你,你能理解谷歌的源代碼,以完成您的工作(我發現這是一個有點棘手理解)