如何获取在android中更新值的特定行

如何获取在android中更新值的特定行,android,sqlite,cursor,Android,Sqlite,Cursor,我正在使用SQLite数据库。每次更新1或2行值时,表中会不断更新 例如:现在表1中有20行,其中一些行的值得到更新 我们能知道表1中更新了哪些行吗 我有解决方案,但性能对我很重要。游标使用一个选择查询来注册data observer,该查询选择所有行,当有更新时,我用更新的值检索整个20行,然后进行编码。所以,如果有100行,我需要循环所有的行,这对于低端设备来说是一项乏味的任务 请提供一个解决方案,即如何在Android中使用光标检索表中更新的行。如果您可以更改表,请添加一个新的列“modi

我正在使用SQLite数据库。每次更新1或2行值时,表中会不断更新

例如:现在表1中有20行,其中一些行的值得到更新

我们能知道表1中更新了哪些行吗

我有解决方案,但性能对我很重要。游标使用一个选择查询来注册data observer,该查询选择所有行,当有更新时,我用更新的值检索整个20行,然后进行编码。所以,如果有100行,我需要循环所有的行,这对于低端设备来说是一项乏味的任务


请提供一个解决方案,即如何在Android中使用光标检索表中更新的行。

如果您可以更改表,请添加一个新的列“modified_time”,类型为TIMESTAMP。每当更新行时更新此列

现在,如果要知道哪些行已更新,请运行以下SQL查询:

从表2中选择_id,其中修改的_时间=从表2中选择最大修改的_时间

此查询的结果给出了最新更新的所有行的id

编辑: 正如你在评论中提到的。。。服务器将数据推送到具有更改值的表中。我需要获取更新值并更新到其他表,您最好的选择是在DB中创建一个触发器,该触发器将根据第一个表上的更新更新第二个表。这里是方法

假设服务器将数据推送到“table1”,您希望监视更新的行。创建另一个表2或使用将自动更新的现有表

现在,创建一个触发器,如下所示:

CREATE TRIGGER trigger1 AFTER UPDATE ON table1
 BEGIN
  update table2 SET modified_time = datetime('now') WHERE row_id = old._id;
 END;
当然,您的table2会有所不同,但是您可以使用触发器自动插入或更新table2中的行。有关更多详细信息,请参阅以下SO帖子:

示例应用程序: 我创建了一个示例应用程序,根据您描述的场景演示在Android应用程序中使用触发器。您可以在此处下载Eclipse项目-

简而言之,示例应用程序有一个product表,用于接收产品价格的更新。因此,我们创建了另一个更新表,该表将根据产品表上的更新通过触发器自动更新

有一个UI,通过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) {
    }

}

您可以保留一个类似LAST_UPDATE_TIME的列,该列在更新时使用当前时间进行更新

然后,您可以查询上一次更新时间>所需时间的所有行


如果无法更改表格,是否可以创建具有相同列的新表格?然后,您可以在两个表中进行更新,并在需要时从新表中获取值,并在处理完这些值后仅从新表中删除它们。

如果您正确实现了ContentProvider,则insert或update可能会返回行的id

这有点复杂,但是请查看一下提供者和契约类,查看契约中的Room类,以及insert或update方法中提供者中的Room案例。 您将看到将返回一个Uri,在这种设计方法中,最后一个斜杠后面的最后一个元素是插入/更新行的id


我认为这种方法可以帮助您,并且您可以理解谷歌的源代码来完成您的工作。我发现理解起来有点棘手

对不起,这不是我问题的答案,我想从数据库中获取更新的行值……请查看我编辑过的答案。查询未优化。也许有更好的方法来编写查询。但是你明白了。谢谢你提供的信息…我还有一个疑问…如果第一行在11.36更新pn,第二行在11.37更新。当我发送一个查询时,它会得到两个更新的值,还是只得到11.37。也很抱歉,我无法更改该表…因为服务器将数据推送到具有更改值的表中。我需要获取更新值并更新到其他表。我假设通过查询更新了多行,所以您将一个修改的时间值传递给更新查询。但是如果行在不同的时间更新,那么您必须提供一个范围,例如modified_time>current_time-delay。您是否可以在DB中创建另一个表或触发器?您是否可以在DB中创建触发器?Internet上有许多Android开发者支持站点。用一种更适合你的语言,你可能会有更好的运气。我在上列出了几个这样的网站。你能把代码贴在更新数据库的地方吗?