2

我想插入一条记录,除非它存在,然后如果它的COLUMN_GENERATION值小于现有记录的值,我想更新该记录。我什至不确定如何构建查询,或者使用什么命令。

我像这样设置我的数据库:

public static final String TABLE_SEARCH = "SearchTable";
public static final String COLUMN_OWNER = "Owner";
public static final String COLUMN_SPOUSE = "Spouse";
public static final String COLUMN_CHILD = "Child";
public static final String COLUMN_GENERATION = "Generations";

private static final String DATABASE_NAME = "searches.db";
private static final int DATABASE_VERSION = 1;

// Database creation sql statement
private static final String DATABASE_CREATE = "CREATE TABLE "
        + TABLE_SEARCH + "("
        + COLUMN_OWNER + " INTEGER PRIMARY KEY, "
        + COLUMN_SPOUSE + " INTEGER DEFAULT 0, "
        + COLUMN_CHILD + " INTEGER DEFAULT 0, "
        + COLUMN_GENERATION
        + " INTEGER DEFAULT 0);";

这是我现在使用的查询,它只是忽略了冲突的条目:

values.put(SearchDatabaseHelper.COLUMN_OWNER, personID);
values.put(SearchDatabaseHelper.COLUMN_SPOUSE, spouseID);
values.put(SearchDatabaseHelper.COLUMN_CHILD, childID);
values.put(SearchDatabaseHelper.COLUMN_GENERATION, gens);
long insertID = database.insertWithOnConflict(SearchDatabaseHelper.TABLE_SEARCH, null, values, SQLiteDatabase.CONFLICT_IGNORE);

我尝试输入一个查询来首先搜索数据库,然后根据需要插入或更新,但这真的很慢并且实际上并没有工作。我肯定会感谢一些帮助。

哇——作为一个重复的问题关闭了。没有真正的答案。我担心我没有正确地说出我的问题的标题,所以人们只是略读了一下,并没有阅读我所问的内容。

似乎没有人注意到第一段中的关键短语:

COLUMN_GENERATION“如果它的值小于现有记录的值,我想更新该记录。”

我可以插入/更新数据库。潜在的问题是,“是否可以使用我的主键进行单个查询来查看数据库中是否存在行,如果不存在,则插入,如果存在,则仅在存储的情况下更新其中一列的值高于输入的数据?”

我真的希望能够在一个 SQLite 调用中完成这一切,因为 SQLite 比 SQLite 之外的比较和决策要快得多。

4

1 回答 1

1

从数据库中读取现有记录的生成。如果它存在并且具有较低的代,则将其删除。如果它不存在或具有较低的一代,则插入新的一代。

各种INSERT OR XXX命令仅适用于特定的常见情况;对于您的算法,您必须将其写出来。

只需正确编写命令并围绕它们包装一个事务,它就会快速运行。

于 2013-04-12T16:32:57.387 回答