【问题标题】:FMDB lastinsertRowID always 0FMDB lastinsertRowID 始终为 0
【发布时间】:2012-10-10 05:03:45
【问题描述】:

喂。

我已经在我的应用中实现了 FMDB。我正在尝试使用这个从我的一个数据库中获取最后一行 id

FMDatabase *bdb=[FMDatabase databaseWithPath:databasePath];
    NSString *str;
    if([bdb open]){
        int lastId=[bdb lastInsertRowId];
        FMResultSet *s = [bdb executeQuery:[NSString stringWithFormat:@"SELECT budget FROM data WHERE ROWID='%d'",lastId]];
        if([s next])
        {
            str= [s stringForColumnIndex:0];
        }
    }

我遇到的问题是 lastId 始终为 0 ,尽管数据库中当前有 3 个条目。 Any1 知道为什么会这样吗?

编辑:数据库是这样创建的:

NSFileManager *filemgr = [NSFileManager defaultManager];
    if ([filemgr fileExistsAtPath: databasePath ] == NO)
    {
        const char *dbpath = [databasePath UTF8String];

        if (sqlite3_open(dbpath, &basicDB) == SQLITE_OK)
        {
            char *errMsg;
            const char *sql_stmt = "CREATE TABLE IF NOT EXISTS DATA (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, BUDGET INTEGER)";

            if (sqlite3_exec(basicDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)
            {
               DLog(@"Failed to create table");
            }
           sqlite3_close(basicDB);

        } else {
           DLog(@"Failed to open/create database");
        }
    }

【问题讨论】:

    标签: iphone ios ipad sqlite fmdb


    【解决方案1】:

    lastInsertRowId 在特定连接上工作。 您正在使用的连接刚刚打开,因此没有插入行 ID。

    lastInsertRowId 的目的是让您的应用知道刚刚被INSERTed 的记录的ID。)

    要从最后一条记录中读取数据,请使用以下内容:

    SELECT budget FROM data WHERE rowid = (SELECT max(rowid) FROM data)
    

    【讨论】:

    • 啊哈!谢谢你的解释。但是假设我不会使用 FMDB 而使用 SQLITE API,那么 select_last_row_id() 会以类似的方式表现吗?
    • 是的;这就是lastInsertRowId 的实现方式。
    • 那么 INSERT 查询如何知道在相应的 rowid 处插入一行?我的意思是,rowid 设置为自动增量,但在这样的假设示例中:数据库包含 3 个项目,其中 rowid 为 1,2 和 3。您插入第四个项目; sql把它放在rowid 4;然后删除新行;之后你再做一次 INSERT;新行的 rowid 为 5,即使在最后一次 INSERT 时,max_rowid 为 3。
    • 非常感谢。您链接的文件揭示了事情的运作方式。现在这个 sqlite_sequence - 如何在 fmdb 中访问它?像SELECT seq FROM sqlite_sequence WHERE name='table_name' 这样的东西?
    • 还没试过;现在我使用了 max(rowid) 但我会尝试并在此处发布结果以供将来参考。再次感谢您提供的所有信息 - 真的非常好!
    猜你喜欢
    • 2015-01-02
    • 2023-03-10
    • 2014-01-09
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多