【问题标题】:iPhone iOS: SQLite3 Not able to get last ID value in TableiPhone iOS:SQLite3 无法获取表中的最后一个 ID 值
【发布时间】:2011-12-01 20:52:40
【问题描述】:

我几乎一整天都在试图弄清楚这一点,经过几次尝试,我想我会看看这里是否有人可能有一些想法。欢迎任何帮助。

我有一个非常简单的 ID 和姓名表,我想获取表中的最后一个 ID 值。

虽然我没有收到任何编译错误或运行时错误,但我得到了错误的 ID 值。根据 SQLiteManager(可以直接检查数据库),我的最大 ID 是 10,但是,无论我做什么,我都只是为 PlayKey 获得 0 值。

定义如下:

//CREATE THE Plays TABLE
char *errorMsg;
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS Plays (ID integer PRIMARY KEY AUTOINCREMENT,PlayName text);";
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK){
    sqlite3_close(database);
    NSAssert1(0, @"Error creating table: %s", errorMsg);
}

这是我尝试获取插入其中的最后一个 ID 的地方:

NSString *query3 = [NSString stringWithFormat:@"SELECT MAX(ID) FROM Plays"];
sqlite3_stmt *statement3;
if (sqlite3_prepare_v2(database, [query3 UTF8String], -1, &statement3, nil) == SQLITE_OK) {
    PlayKey = sqlite3_column_int(statement3, 0);
    NSString* msg4 = [NSString stringWithFormat:@"This worked! The PlayKey was %d", PlayKey];
    NSLog(msg4);
}
if (sqlite3_step(statement3) !=SQLITE_DONE) {NSLog(@"Error inserting to Steps");}

我还尝试使用更简单的内置函数来做到这一点:

PlayKey = sqlite3_last_insert_rowid(database);

这两种尝试都导致错误的值 0。

【问题讨论】:

    标签: iphone ios sqlite row


    【解决方案1】:

    您还可以通过 sqlite_sequence 检索任何表的最后一个 ID。 前-

    +(int)getLastLocationId{
        NSString *sqlNsStr = [NSString stringWithFormat:@"SELECT * FROM sqlite_sequence where name='Location'"];
        const char *sql = [sqlNsStr cStringUsingEncoding:NSUTF8StringEncoding];
        int lastrec=0;
        //    if(sqlite3_open([dbPath UTF8String], &masterDB) == SQLITE_OK){
        if (sqlite3_prepare_v2(masterDB, sql, -1, &init_statement, NULL) == SQLITE_OK) {
            while(sqlite3_step(init_statement) == SQLITE_ROW) {
                lastrec = sqlite3_column_int(init_statement, 1);
            }
            sqlite3_reset(init_statement);
        }
        return lastrec;
    }
    

    【讨论】:

    • 啊,我明白了。谢谢!可能不是最有效的方法,但它得到了正确的 ID!
    【解决方案2】:

    这是在第一次插入之后吗?或者你已经有很多记录了? ROWID 以 0 开头,因此第一条记录的 ROWID=0。

    【讨论】:

    • 不,我已经有一堆记录了。根据单独的应用程序(SQLite 管理器),正确的 ROWID 应该是 10。即使我立即输入多条记录,我仍然只能得到 0。
    • 我刚刚注意到您自己创建了 ID 字段。为什么?每行都会自动创建字段 ROWID。您可以通过直接指定来访问:select ROWID,* from TABLE。这个ROWID应该由sqlite3_last_insert_rowid返回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2012-12-24
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多