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

时间:2010-12-29 17:13:56

标签: 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。我无法理解问题出在哪里。

使用以下查询创建表:

CREATE TABLE [Patient](PID整数NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,PFirstName text NOT NULL,PLastName text,PSex text NOT NULL,PDOB text NOT NULL,PEducation text NOT NULL,PHandedness text,PType text)

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;}

4 个答案:

答案 0 :(得分:1)

Google找到了this,它告诉了我:

#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */

你在某个地方违反了约束。您的PID不是唯一的,或者患者的外键不是指有效的患者ID,这将是我的猜测。

答案 1 :(得分:1)

我做了一点改动(试错法)及其工作。我不知道原因,为什么它的工作........这是我对代码的更改:

sqlite3_bind_int(insertResultStatement, 1, i);
sqlite3_bind_int(insertResultStatement, 2, i);
sqlite3_bind_int(insertResultStatement, 3, i);

更改是,之前我的第一个sqlite3_bind_int第二个参数以“0”开头,而不是以“1”开头。

如果有人找到原因,请更新此链......

答案 2 :(得分:1)

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

-(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开始。

答案 3 :(得分:0)

如果您还发布了createStatement()代码,它会有所帮助。如果没有这个,我猜你没有在INSERT中为一个NOT NULL列指定一个值。