0

只想问一个关于 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 之前。为什么它说它在那里而不是它?

4

2 回答 2

0

After trying a lot of seemingly unrelated things, and almost giving up on using SQLite3, I finally decided to put ALL of the table values into the REPLACE INTO line:

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

Now it's working fine, as designed.

于 2012-10-12T23:50:42.560 回答
0

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

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

于 2012-10-11T09:13:36.783 回答