0

SQLite3のREPLACEINTOの使用法について基本的な質問をしたいだけです。他のすべてのデータベースコードは機能していますが、REPLACE INTOステートメントは機能しているようですが、機能していません。変数dbRowに保持されている指定された行IDidのデータをREPLACEするためにREPLACEINTOを期待します。

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

アプリバンドルにあるデータベースファイルを更新しようとしているようです。アプリバンドル内のファイルに書き込むことができないため、これは不可能です(明らかなセキュリティ上の理由から)。データベースを変更する前に、データベースを書き込み可能な場所、たとえばDocumentsまたはLibraryディレクトリにコピーする必要があります。

(なぜsqlite3ライブラリがまだ成功を報告するのですか?iOSのカーネルとサンドボックスサービスはトリッキーなので、sqlite3はカーネルによって問題のファイルを正常に書き込んだことを通知されますが、実際の書き込みは黙ってスキップされます。ファイル/ディレクトリのサンドボックスプロファイル。)

于 2012-10-11T09:13:36.783 に答える
0

一見無関係に見えることをたくさん試し、SQLite3の使用をほとんど諦めた後、私はついにすべてのテーブル値をREPLACEINTO行に入れることにしました。

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

これで、設計どおりに正常に動作しています。

于 2012-10-12T23:50:42.560 に答える