如何选择性地替换 sqlite 行?

Posted

技术标签:

【中文标题】如何选择性地替换 sqlite 行?【英文标题】:How to selectively replace sqlite row? 【发布时间】:2014-10-09 20:21:44 【问题描述】:

在我的案例 2 中,我正在尝试为 qrcode 替换后面的 sqlite 条目。我想用新的 FBid 更新该行。如何选择它然后替换它?它与sqlite有关吗?还是我需要在我的应用中应用一些逻辑?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"easyKTDB.sqlite"];

FMDatabase *database = [FMDatabase databaseWithPath:path];

[database open];

FMResultSet *results = [database executeQuery:@"select * from ktcode where code = ?;", qrCode];

while ([results next]) 
    ktcode *aktcode = [ktcode new];
    aktcode.ktCODE = [results stringForColumn:@"code"];
    aktcode.ktFBID = [results stringForColumn:@"fbid"];
    aktcode.uniqueID = [results intForColumn:@"id"];

    [ktcodeArray addObject:aktcode];



switch (ktcodeArray.count)

    case 0 :
        [database executeUpdate:@"insert into ktcode (code, fbid) values (?, ?)", qrCode, FBid];
        NSLog(@"%@ is now registered to %@ - %@", qrCode, userName, FBid);
        break;

    case 1:
        [database executeUpdate:@"insert into ktcode (code, fbid) values (?, ?)", qrCode, FBid];
        NSLog(@"%@ now belongs to %@ - %@", qrCode, userName, FBid);
        break;

    case 2:
        //[database executeUpdate:@""];
         NSLog(@"ktCodeArray: %@", ktcodeArray);
         NSLog(@"%@ has been transfered to %@ - %@", qrCode, userName, FBid);
        break;

    default :
        NSLog(@"Nothing else can be done");
        //delete multiple entries here

【问题讨论】:

您基本上是在问“如何在 SQLite 中执行 UPDATE?” (获取 sqlite3 命令行工具并从命令窗口使用它。您可以从命令行对数据库执行所有操作,看看它们是如何工作的。将它与基本的SQLite 教程。) 是的,但我如何有选择地执行它?我将始终拥有最多两个具有相同 qrcode 但两个不同 fbid 的条目。原始条目将保持不变。但第二个条目将不断更新新的 fbid。所以我想知道如何选择更新的条目进行更新? 阅读优秀的 SQLite documentation(或您选择的教程),尤其是 WHERE 子句。 【参考方案1】:

您似乎正在 SQLite 中寻找 REPLACE 关键字:https://www.sqlite.org/lang_replace.html

如果你有唯一标识符,那么你可以这样做:

[database executeUpdate:@"replace into ktcode (id, code, fbid) values (?, ?, ?)", uniqueId, qrCode, FBid];

【讨论】:

谢谢!我知道我将不得不使用替换键,但我需要确保我不会替换两个条目,所以我需要一种方法来选择后面的条目,我在想,我可能错了,我需要包括 where 键,例如,替换为 ktcode (fbid) 值 (?) where fbid != ?;", FBid) 只要你的table的key是id,其他的就不会被替换。如果id 不是键,那么您可以选择并使用rowid 而不是sqlite.org/lang_createtable.html#rowid 如果我错了,请纠正我,但你是说我需要替换后面那个 id 的位置? @JimChen 正确 - 您需要使用表中已有项目的 id 好的,我快到了,那我该如何选择那个ID呢?我已经检索到所有具有匹配 qrcode 的行,那么如何从中获取 id?

以上是关于如何选择性地替换 sqlite 行?的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地插入或替换 SQLite 中的一行?

如何在函数重载的情况下选择性地替换 Visual Studio 中的函数?

如何使用 #pragma 和 gcc 选择性地禁用 -Werror

JDBC - SQLITE 选择变量

如何选择特定日期的某些行

如何将多个查找和替换转换为更有效的循环