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

qmelpv7a  于 2023-05-18  发布在  SQLite
关注(0)|答案(3)|浏览(203)

我使用的是SQLite数据库。每次更新1或2个行值时,表中会出现连续更新。
例如:现在表1中有20行,其中一些行的值被更新。

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

我有解决方案,但性能对我来说很重要。游标用选择所有行的选择查询注册数据观察者,当有更新时,我用更新的值检索整个20行,做我的编码。因此,如果有100行,我需要循环所有这是一个繁琐的任务,为低端设备。
请协助一个解决方案,即如何检索更新的行在Android中的表使用光标.

qvsjd97n

qvsjd97n1#

如果可以更改表,则添加类型为TIMESTAMP的新列'modified_time'。每当更新行时更新此列。
现在,当你想知道哪些行被更新时,运行这个SQL查询:
select _id from table2 where modified_time = (select max(modified_time) from table2)
这个查询的结果给出了最近更新的所有行的id。

**编辑:**正如您在评论中提到的“……server pushes the data to table with changed values.i need the update values and update to other table",最好的选择是在数据库中创建一个触发器,它会根据第一个表的更新来更新第二个表。这就是方法。

假设服务器将数据推送到'table 1',您希望监视更新的行。创建另一个table 2(或使用现有的),它将自动更新。
现在,创建一个触发器,如下所示:

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

当然,您的table 2会有所不同,但是您可以使用trigger自动插入或更新table 2中的行。您可以参考这些SO帖子以了解更多详细信息:
Does sqlite3 support a trigger to automatically update an 'updated_on' datetime field?
Using SQLite Trigger to update "LastModified" field

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

简而言之,示例应用程序有一个 product 表,用于接收产品价格的更新。因此,我们创建另一个 updates 表,它将通过触发器根据 product 表上的更新自动更新。
通过EditText字段和Button,有一个UI来模拟 product Table上的更新。为了显示最近的更新,我们有一个ListView,它使用Cursor从 updates Table中获取数据。
下面是一些来自www.example.com的相关代码片段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) {
    }

}
h5qlskok

h5qlskok2#

您可以保留一个像LAST_UPDATE_TIME这样的列,在更新时使用当前时间进行更新。
然后,您可以只查询LAST_UPDATE_TIME >所需时间的所有行。
如果你不能改变表,你能用相同的列创建一个新表吗?然后,您可以在两个表中进行更新,并在需要时从新表中获取值,并在完成后仅从新表中删除它们。

mbskvtky

mbskvtky3#

如果您正确地实现了ContentProvider,则插入或更新可以返回行的id。
这有点复杂,但看看Google的IOSchedule应用程序,查看ProviderContract类,查看Contracts中的Room类以及插入或更新方法中Provider中的“Room”案例。
您将看到将返回一个Uri,在这种设计方法中,最后一个元素(最后一个斜杠之后)是插入/更新行的id
我认为这种方法可以帮助你,而且你可以理解谷歌的源代码来完成你的工作(我发现它有点难以理解)

相关问题