0

私はios(Objective-C)とsqlに非常に慣れていません。私はここにあるsqlite(特にsqlite3)のチュートリアルに従っています:http://www.tutorialspoint.com/ios/ios_sqlite_database.htm そして私はすべてを正しく実装しました。問題は、同じ reg id (データベース内の要素を検索するために使用される主キー) で情報を入力しようとすると、キーが一意ではないというエラーが表示されることです。

- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name
   department:(NSString*)department year:(NSString*)year;
    {
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *insertSQL =
        [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values (\"%d\",\"%@\", \"%@\", \"%@\")",[registerNumber integerValue], name, department, year];

        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
        int s = sqlite3_step(statement);
        const char *errmsg = sqlite3_errmsg(database);
        if (s == SQLITE_DONE)
        {
            sqlite3_reset(statement);
            return YES;
        }
        else {
            sqlite3_reset(statement);
            return NO;
        }
    }
    return NO;
}

saveData: アクションを作成するにはどうすればよいですか? 単に拒否されるのではなく、実際にデータベース内のエントリを更新しますか? ありがとう!

4

1 に答える 1

0

「既存のレジストリ ID を入力しようとすると、残りのプロパティが新しいプロパティで上書きされるように拡張したい」

これが目的の場合は、INSERT ステートメントを使用しないでください。主キーの目的は、同じ主キーを持つ重複行からデータベースを保護することです。そう考えると断るのが妥当。

本当に欲しいのは、INSERT OR REPLACEを使用することです

SQL と Objective C の両方の初心者である場合は、私が作成した初心者向けの sqlite ラッパーをお勧めします: TankDB

編集:

コード例:

INSERT OR REPLACE INTO studentsDetail (regno,name, department, year) の値 (\"%d\",\"%@\", \"%@\", \"%@\")"

この質問を参照して、実際に「UPSERT」を使用するつもりがないことを確認してください。INSERT OR REPLACE は既存の行を新しい情報で更新しないことに注意してください。既存の行を完全に削除して置き換えます。

Edit2: 開く、準備する、ステップする、ファイナライズする、閉じる

const char *dbpath = [_databasePath UTF8String];
if(sqlite3_open(dbpath, &_database) == SQLITE_OK) {
    const char *command = [query UTF8String];

    // Perform the query
    if (sqlite3_prepare_v2(_database, command, -1, &selectstmt, NULL) == SQLITE_OK) {

        // For each row returned
        while (sqlite3_step(selectstmt) == SQLITE_ROW) {
            // Do stuff
        }
    }
    sqlite3_finalize(selectstmt);
}

sqlite3_close (_database);
于 2013-10-11T22:09:41.530 に答える