2013-02-28 69 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

我这种方法可以帮助你,你能理解谷歌的源代码,以完成您的工作(我发现这是一个有点棘手理解)