objective-c - 基于ID的Objective C SQLite更新查询

标签 objective-c sqlite sql-update

试图在不使用包装的情况下学习Sqlite并已管理了大多数事情,但实际上卡在了UPDATE查询中

我正在尝试根据它的_ID号(它是主键且唯一)更新一列中的字符串。

我已经尝试了Google各处的各种代码。这说它已经起作用,但是当我检查列没有更新时

这是代码

            NSDateFormatter *formatter;
            NSString        *dateString;
            formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"dd-MM-yyyy HH:mm"];
            dateString = [formatter stringFromDate:[NSDate date]];
            NSString *IDCODE = code.stringValue;
           NSInteger b = [IDCODE integerValue];
            sqlite3 *contactDB; //Declare a pointer to sqlite database structure
            const char *dbpath = [dbPath UTF8String]; // Convert NSString to UTF-8
            if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
            {
                //Database opened successfully
                NSString *databaseName = @"vistorlog.db";
                // Get the path to the documents directory and append the databaseName
                NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsDir = [documentPaths objectAtIndex:0];
                NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
                const char *dbPath=[databasePath UTF8String];
                if (sqlite3_open(dbPath, &myDB)==SQLITE_OK) {
                    NSLog(@"database Opened");
                    const char* updateQuery="update LOG set TIMEOUT='22/03/19' where _ID=1";
                    sqlite3_stmt *stmt;
                    if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL)==SQLITE_OK) {
                        NSLog(@"Query Executed");
                    }else{
                         NSLog(@"Query NOT Executed");
                                               }
                }
                sqlite3_close(myDB);
                }
                else {
                //Failed to open database
            }


它将打开数据库vistorlog.db。有一个名为LOG的表,有一个名为TIMEOUT的列,这是我想要更新字符串的地方,还有一个名为_ID的列,这是我基于查询但不会更新的内容

最终我想让update语句使用字符串变量dateString作为要更新的字符串,将b作为_ID的整数变量

任何想法,我错了吗?

任何帮助表示赞赏

标记

编辑

工作代码以更新查询

sqlite3 *contactDB; //Declare a pointer to sqlite database structure
            const char *dbpath = [dbPath UTF8String]; // Convert NSString to UTF-8
            if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
            {
                //Database opened successfully
                NSString *databaseName = @"vistorlog.db";
                // Get the path to the documents directory and append the databaseName
                NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *documentsDir = [documentPaths objectAtIndex:0];
                NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
                const char *dbPath=[databasePath UTF8String];
                if (sqlite3_open(dbPath, &myDB)==SQLITE_OK) {
                    NSLog(@"database Opened");

// define dateString and IDCODE as strings before this
                    const char *updateQuery = "Update log set TIMEOUT=? where _ID=?";
                    sqlite3_stmt *stmt;
                    // Prepare Stment
                    if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL) == SQLITE_OK) {
                        sqlite3_bind_text(stmt, 1, [dateString UTF8String], -1, SQLITE_TRANSIENT);
                        sqlite3_bind_text(stmt, 2, [IDCODE UTF8String], -1, SQLITE_TRANSIENT);                            if(sqlite3_step(stmt) == SQLITE_DONE) {
                            NSLog(@"Query Executed");
                        } else {
                            NSLog(@"Query NOT Executed: %s", sqlite3_errmsg(myDB));
                        }
                        sqlite3_finalize(stmt);

                    }else{
                        NSLog(@"Statement NOT Prepared: %s", sqlite3_errmsg(myDB));
                    }
                }
                sqlite3_close(myDB);
                }
                else {
                //Failed to open database
            }


别忘了导入sqlite3.h

标记

最佳答案

您仅在准备语句,而没有实际执行它。

执行sqlite3_step()后需要执行sqlite3_prepare_v2

if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL) == SQLITE_OK) {
    if(sqlite3_step(stmt) == SQLITE_DONE) {
        NSLog(@"Query Executed");       
    } else {
        NSLog(@"Query NOT Executed: %s", sqlite3_errmsg(myDB));
    }
    sqlite3_finalize(stmt);

}else{
    NSLog(@"Statement NOT Prepared: %s", sqlite3_errmsg(myDB));
}

关于objective-c - 基于ID的Objective C SQLite更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585490/

相关文章:

java - Android SQLite 查询太慢

sql - 使用映射表更改大量记录键

ios - 将 subview Controller 正确添加到 UINavigationBar

objective-c - 从不同的对象设置 NSStatusItem 工具提示

objective-c - 为什么只能在头文件中#define NSString 常量?

android - 如何从数据库中提取单行

android - 我应该怎么做才能将数据从 json 插入到 Android 中的 sqlite 中

ios - 如何在iOS中通过触摸来使对象移动

php - 在 MySQL 中更新表

c# - 多个表的通用批量更新