iPhone - 使用 sql 数据库 - 插入语句失败

标签 iphone insert sqlite

我在我的 iPhone 应用程序中使用 sqlite 数据库。 我有一个包含 3 个整数列的表。 我正在使用以下代码写入该数据库表。

-(BOOL)insertTestResult {
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* dataBasePath = [documentsDirectory stringByAppendingPathComponent:@"test21.sqlite3"];     

BOOL success = NO;
sqlite3* database = 0;
if(sqlite3_open([dataBasePath UTF8String], &database) == SQLITE_OK) 
{
    BOOL res = (insertResultStatement == nil) ? createStatement(insertResult, &insertResultStatement, database) : YES;
    if(res)
    {
        int i = 1;
        sqlite3_bind_int(insertResultStatement, 0, i);
        sqlite3_bind_int(insertResultStatement, 1, i);
        sqlite3_bind_int(insertResultStatement, 2, i);

        int err = sqlite3_step(insertResultStatement);
        if(SQLITE_ERROR == err) 
        {
            NSAssert1(0, @"Error while inserting Result. '%s'", sqlite3_errmsg(database));
            success = NO;
        }
        else 
        {
            success = YES;
        }
        sqlite3_finalize(insertResultStatement);
        insertResultStatement = nil;            
    }
}
sqlite3_close(database);    
return success;}

命令 sqlite3_step 总是给出错误 19。我无法理解问题出在哪里。

表是使用以下查询创建的:

创建表 [患者](PID 整数不为空主键自动增量唯一、PFirstName 文本不为空、PLastName 文本、PSex 文本不为空、PDOB 文本不为空、PEeducation 文本不为空、PHandedness 文本、PType 文本)

CREATE TABLE PatientResult(PID INTEGER,PFreeScore INTEGER NOT NULL,PForcedScore INTEGER NOT NULL,FOREIGN KEY (PID) REFERENCES Patient(PID))

我在 Patient 表中只有一个 PID = 1 的条目

BOOL createStatement(const char* query, sqlite3_stmt** stmt, sqlite3* database){
BOOL res = (sqlite3_prepare_v2(database, query, -1, stmt, NULL) == SQLITE_OK);
if(!res) 
    NSLog( @"Error while creating %s => '%s'", query, sqlite3_errmsg(database));
return res;}

最佳答案

我已经更新了您的代码。这样做:

-(BOOL)insertTestResult {
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentsDirectory = [paths objectAtIndex:0];
    NSString* dataBasePath = [documentsDirectory stringByAppendingPathComponent:@"test21.sqlite3"];     

    BOOL success = NO;
    sqlite3* database = 0;
    if(sqlite3_open([dataBasePath UTF8String], &database) == SQLITE_OK) 
    {
        BOOL res = (insertResultStatement == nil) ? createStatement(insertResult, &insertResultStatement, database) : YES;
        if(res)
        {
            int i = 1;
            sqlite3_bind_int(insertResultStatement, 1, i);  //updated
            sqlite3_bind_int(insertResultStatement, 2, i);  //updated
            sqlite3_bind_int(insertResultStatement, 3, i);  //updated

            int err = sqlite3_step(insertResultStatement);
            if(SQLITE_ERROR == err) 
            {
                NSAssert1(0, @"Error while inserting Result. '%s'", sqlite3_errmsg(database));
                success = NO;
            }
            else 
            {
                success = YES;
            }
            sqlite3_finalize(insertResultStatement);
            insertResultStatement = nil;            
        }
    }
    sqlite3_close(database);    
    return success;
}

原因是你的索引是从0开始的,这是错误的。当您向数据库表中插入数据时,需要从索引1开始插入。当您尝试从数据库中获取数据时,从索引0开始插入。

关于iPhone - 使用 sql 数据库 - 插入语句失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556164/

相关文章:

iphone - 如何绘制特定颜色的CGGradient?

ios - iOS Storyboard是否具有相当于工具 :text in android? 的功能

php - 在 MySQL 中使用 mysqli 插入数据

mysql - 使用 INSERT 查询将行从一个表复制到另一个表

ios - instagram 和 vine iOS 应用程序如何内联播放视频?

php - 在插入 MySQL 表之前格式化十进制?

sqlite - 适用于 Windows 7 和 Windows 8 手机的 Phonegap/Cordova SQLite 插件?

r - 如何将CSV导入R的Sqlite中,其中变量之一的引号内带有逗号(,)?

java - android 在数据库中添加或删除时间戳中的小时

iPhone 音频单元在后台录音,如何