gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:37:42 27 4
gpt4 key购买 nike

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

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

我们可以知道 TABLE1 中的哪些行已更新吗?

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

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

最佳答案

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

现在当您想知道更新了哪些行时,运行此 SQL 查询:


从 table2 中选择 _id,其中 modified_time =(从 table2 中选择 max(modified_time))

此查询的结果给出了最新更新的所有行的 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

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

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

这里有一些来自 DbHelper.java 的相关代码 fragment

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

}

关于android - 如何获取在android中更新值的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com