【问题标题】:the REPLACE INTO statement in SQLite3 shows a replaced row but actually it isn'tSQLite3 中的 REPLACE INTO 语句显示了替换的行,但实际上不是
【发布时间】:2012-10-13 07:50:42
【问题描述】:

只想问一个关于 SQLite3 的 REPLACE INTO 用法的基本问题。我所有其他数据库代码都在工作,但 REPLACE INTO 语句似乎工作,但不存在。我期望 REPLACE INTO 来替换指定行 ID 中的数据,id,保存在变量 dbRow 中。

insertSQL = [NSString stringWithFormat: @"REPLACE INTO script ( id, nrec, url ) VALUES ( \"%d\", \"%d\", \"%@\" )", dbRow, recN, fileLoc ];
insert_stmt = [insertSQL UTF8String];
if( sqlite3_exec(scriptDB, [insertSQL UTF8String], NULL, NULL, &errorSQL ) == SQLITE_OK) {
   NSLog( @"dB updated at row=%d with nrec=%d and URL=%@.", dbRow, recN, fileLoc );
} else {
   NSLog(@"Line Not replaced.  Error: %s", errorSQL );
}

以上工作:OK 条件准确地显示了我想要看到的内容。没有错误。后来,当我需要使用这些数据时,它并没有取代原来的。所以,为了测试,我马上用同样的方法做一个 SELECT:

querySQL = [NSString stringWithFormat: @"SELECT id, nrec, url FROM script WHERE title=\"%@\" AND nline=\"%d\"", myTitle, myLineN ];
query_stmt = [querySQL UTF8String];
if( sqlite3_prepare_v2(scriptDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) {
   NSLog(@"Just Replaced Query prepared");
   while( sqlite3_step(statement) == SQLITE_ROW ) {
      myID = sqlite3_column_int(statement, 0);
      myNRec = sqlite3_column_int(statement, 1);
      myURL = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 4)];
   }
   sqlite3_finalize(statement);
   NSLog( @"Line %d of %@ has: recN=%d in row=%d at url: %@", myLineN, myTitle, myNRec, myID, myURL );
} else {
   NSLog( @"Error: %s", errMsg );
}

我希望看到与我替换为数据库相同的内容。我不。我看到的是原始数据,在 REPLACE 之前。为什么它说它在那里而不是它?

【问题讨论】:

  • 因为您正在尝试更新应用程序包中的文件?这么多关于这个完全相同的问题的傻瓜......
  • 没有答案?那我在下面发了什么?

标签: iphone ios sqlite replace


【解决方案1】:

您似乎正在尝试更新位于您的应用程序包中的数据库文件。这是不可能的,因为您无法写入应用程序包中的文件(出于明显的安全原因)。您必须将数据库复制到可写位置,例如。 G。在更改之前进入 Documents 或 Library 目录。

(好奇为什么 sqlite3 库仍然报告成功?好吧,因为 iOS 中的内核和沙盒服务很棘手。sqlite3 被告知内核已成功写入有问题的文件,但是实际的写入被默默地跳过根据文件/目录的沙盒配置文件。)

【讨论】:

  • 这样更有帮助。谢谢你。现在它在:/Users/apple/Library/Application Support/iPhone Simulator/6.0/Applications/8AF97457-7F0E-4994-9C45-106DBF79C930/Documents/script2.db
  • 我的应用程序中有几个视图控制器,并且我在控制器之间成功使用了 INSERT 和 SELECT。只是 REPLACE INTO 表现得很奇怪。
  • 更新:我在外部创建了我的数据库并将它们复制到我的项目中的支持​​文件下。然后我按照上面评论中的链接在我的 AppDelegate.m 中使用 NSLog 注释 createEditableCopyOfScriptsDatabase 以确保一切正常。它是。然后我使用 (NSString *) getWritableScriptsDBPath 来引用数据库。你猜怎么着? REPLACE INTO 仍然没有工作。所以,我把它分成DELETE FROM和INSERT INTO。仍然无法更改数据库。不在模拟器上,也不在实际手机上。任何人都可以指出我会工作的东西吗?
【解决方案2】:

在尝试了很多看似无关的事情,几乎放弃使用 SQLite3 之后,我最终决定将所有表值放入 REPLACE INTO 行:

replaceSQL = [NSString stringWithFormat: @"REPLACE INTO script ( id, title, nline, nrec, role, speak, url ) VALUES (\"%d\", \"%@\", \"%d\", \"%d\", \"%@\", \"%@\", \"%@\")", myID, myTitle, myLineN, recN, myRole, mySpeak, fileLoc ];

现在一切正常,正如设计的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2019-03-04
    • 2020-05-11
    • 2023-03-14
    相关资源
    最近更新 更多