【问题标题】:How get a specific row where value is updated in android如何获取在android中更新值的特定行
【发布时间】:2013-02-28 17:29:40
【问题描述】:

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

例如:现在 TABLE1 中有 20 行,其中一些行值已更新..

我们能否知道 TABLE1 中的哪些行已更新?

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

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

【问题讨论】:

  • 互联网上有很多Android开发者支持网站。使用一种对您来说更舒适的语言,您可能会有更好的运气。我在andglobe.com 列出了几个这样的网站。
  • 你能把更新数据库的代码贴出来吗?

标签: android sqlite cursor


【解决方案1】:

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

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

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

这个查询的结果给出了最新更新的所有行的 id。

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

假设服务器将数据推送到“table1”并且您想要监控更新的行。创建另一个 table2(或使用现有的),它将自动更新。

现在,按如下方式创建触发器:

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

当然,您的 table2 会有所不同,但想法是您可以使用触发器自动在 table2 中插入或更新行。您可以参考这些 SO 帖子了解更多详情:

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

Using SQLite Trigger to update "LastModified" field

示例应用程序: 我创建了一个示例应用程序,以根据您描述的场景演示在 Android 应用程序中使用 Trigger。你可以在这里下载 Eclipse 项目 - trigger_example_eclipse_project.zip

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

有一个 UI 可以通过 EditText 字段和按钮来模拟 product 表的更新。为了显示最近的更新,我们有一个 ListView,它使用 Cursor 从 updates 表中获取数据。

这里有一些来自 DbHelper.java 的相关代码 sn-p

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) {
    }

}

【讨论】:

  • 抱歉,它不能回答我的问题,我想从数据库中获取更新后的行值...
  • 请看我编辑的答案。查询未优化。也许有更好的方法来编写查询。但你明白了。
  • 感谢您的信息...我也有疑问..如果第一行在 11.36(时间)更新,第二行在 11.37 更新。当我发送查询时,它会获得两个更新的值还是仅获得 11.37。也很抱歉我无法更改表...因为服务器将数据推送到更改值的表中。我需要获取更新值并更新到其他表..
  • 我假设通过查询更新了多行,因此您将一个 modified_time 值传递给 UPDATE 查询。但是如果行在不同的时间更新,那么你将不得不为 ex 提供一个范围。 modified_time > current_time - 延迟。您是否可以在数据库中创建另一个表或触发器?
  • 可以在数据库中创建触发器吗?
【解决方案2】:

您可以保留 LAST_UPDATE_TIME 之类的列,在更新时使用当前时间进行更新。

然后您可以只查询 LAST_UPDATE_TIME > 所需时间的所有行。

如果你不能改变表,你可以创建一个具有相同列的新表吗?然后,您可以在两个表中进行更新,并在需要时从新表中获取值,并仅在完成后从新表中删除它们。

【讨论】:

    【解决方案3】:

    如果您正确实现 ContentProvider,则插入或更新可能会返回该行的 ID。

    有点复杂,不过看看Google's IOSchedule app查看ProviderContract类,看看Room类在插入或更新方法中,提供者中的合同和“房间”案例。
    您会看到将返回一个 Uri,在这种设计方法中,最后一个元素(在最后一个斜线之后)是插入/更新行的 id

    我这种方法可以帮助你,并且你可以理解谷歌的源代码来完成你的工作(我发现它有点难以理解)

    【讨论】:

      猜你喜欢
      • 2022-10-08
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多