如果您可以更改表,则添加一个 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) {
}
}