Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios sqlite3\u last\u insert\u rowid在第一次插入后返回0_Ios_C_Sqlite - Fatal编程技术网

Ios sqlite3\u last\u insert\u rowid在第一次插入后返回0

Ios sqlite3\u last\u insert\u rowid在第一次插入后返回0,ios,c,sqlite,Ios,C,Sqlite,我使用以下代码将一行插入数据库。出于某种原因,sqlite3\u last\u insert\u rowid会为插入的第一行返回正确的行ID,但之后它总是返回0 在插入之间,可能发生了其他DB操作,如删除行 _scoresDB是一个实例变量 这是我的插入代码: -(void)insertScore:(OKScore*)score { const char *dbpath = [[self dbPath] UTF8String]; if(sqlite3_open(dbpath,

我使用以下代码将一行插入数据库。出于某种原因,sqlite3\u last\u insert\u rowid会为插入的第一行返回正确的行ID,但之后它总是返回0

在插入之间,可能发生了其他DB操作,如删除行

_scoresDB是一个实例变量

这是我的插入代码:

-(void)insertScore:(OKScore*)score
{
    const char *dbpath = [[self dbPath] UTF8String];

    if(sqlite3_open(dbpath, &_scoresDB) == SQLITE_OK) {

        // Setup the SQL Statement
        if(insertScoreStatement == nil) {
            //OKLog(@"Preparing statement for cache score");
            const char *insertSQL = "INSERT INTO OKCACHE(leaderboardID,scoreValue,metadata,displayString,submitted) VALUES(?,?,?,?,?);";

            if(sqlite3_prepare_v2(_scoresDB, insertSQL, -1, &insertScoreStatement, NULL) != SQLITE_OK) {
                OKLog(@"Failed to prepare score insert statement with message: '%s'", sqlite3_errmsg(_scoresDB));
                return;
            }
        }

        // Bind the score values to the statement
        sqlite3_bind_int(insertScoreStatement, 1, [score OKLeaderboardID]);
        sqlite3_bind_int64(insertScoreStatement, 2, [score scoreValue]);
        sqlite3_bind_int(insertScoreStatement, 3, [score metadata]);

        if([score displayString]) {
            sqlite3_bind_text(insertScoreStatement, 4, [[score displayString] UTF8String], -1, SQLITE_TRANSIENT);
        } else {
            sqlite3_bind_null(insertScoreStatement, 4);
        }
        sqlite3_bind_int(insertScoreStatement, 5, (int)[score submitted]);

        //Execute the SQL statement
        if(sqlite3_step(insertScoreStatement) == SQLITE_DONE) {
            int scoreID = sqlite3_last_insert_rowid(_scoresDB);
            [score setOKScoreID:scoreID];
            OKLog(@"Cached score : %@",score);
        } else {
            OKLog(@"Failed to store score in cache wihth error message: %s",sqlite3_errmsg(_scoresDB));
        }


        sqlite3_reset(insertScoreStatement);
        sqlite3_clear_bindings(insertScoreStatement);
        sqlite3_close(_scoresDB);

    } else {
        OKLog(@"Could not open cache DB insertScore");
    }
}

我认为你不应该保留你的声明。您已经将值绑定到它,现在正在将更多内容绑定到它。我会使它成为一个局部变量(不是一个类或属性),如下所示:

    // Setup the SQL Statement
    sqlite3_stmt *insertScoreStatement
    //OKLog(@"Preparing statement for cache score");
    const char *insertSQL = "INSERT INTO OKCACHE(leaderboardID,scoreValue,metadata,displayString,submitted) VALUES(?,?,?,?,?);";

   if(sqlite3_prepare_v2(_scoresDB, insertSQL, -1, &insertScoreStatement, NULL) != SQLITE_OK) {
        OKLog(@"Failed to prepare score insert statement with message: '%s'", sqlite3_errmsg(_scoresDB));
            return;
        }
    }

不能为已关闭的数据库保留语句。 如果尝试重用该旧语句,则不会插入任何内容(既不会插入旧数据库,因为它已关闭,也不会插入新数据库,因为该语句不知道它)

在关闭数据库之前,必须使用释放语句