удалить определенные строки из базы данных sqlite3 - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь удалить строки создания из моей базы данных.Но этого не происходит, поэтому у меня есть содержимое, специфичное для даты, которое дублируется в моей таблице, поэтому я хочу удалять записи на определенную дату и добавлять их каждый раз, когда я устанавливаю соединение

Мой код:

static sqlite3 *database = nil;
static sqlite3_stmt *deleteStmt = nil;

- (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
                                                         NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"person.sqlite3"];
}


    NSDate *today = [NSDate date];
    NSLog(@"%@", today);
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MM/dd/yy"];

    if (sqlite3_open([[self dataFilePath] UTF8String], &database)
        != SQLITE_OK)
    {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    }


    NSString * dateString = [dateFormat stringFromDate:today];
    if(deleteStmt == nil)
    {
        const char *sql = "delete from SHOPPER where DATE = ?";
        if(sqlite3_prepare_v2(database, sql, -1, &deleteStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
    }

    //When binding parameters, index starts from 1 and not zero.
    sqlite3_bind_text(deleteStmt, 3, [dateString UTF8String],-1, NULL);

    if (SQLITE_DONE != sqlite3_step(deleteStmt))
        NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));

    sqlite3_reset(deleteStmt);

    sqlite3_close(database);

1 Ответ

0 голосов
/ 28 ноября 2011

Второй параметр sqlite3_bind_text должен быть 1, а не 3. Это означает индекс «?» характер в подготовленном утверждении, и потому что есть только один "?" в вашем отчете об удалении должно быть 1.

//When binding parameters, index starts from 1 and not zero.
sqlite3_bind_text(deleteStmt, 1, [dateString UTF8String], -1, NULL);

Тогда, почему вы объявляете deleteStmt как статическое и создаете только один раз? Я думаю, что это должно быть создано для открытой базы данных, и потому что вы открываете и закрывать базу данных каждый раз, вы должны создать (и завершить, а не сбросить) deleteStmt каждый раз тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...