无法从sqlite表中获取最后插入的数据

问题描述:

在我的应用程序中,我需要从上一次插入到表中的数据中获取数据。我所做的就是这个无法从sqlite表中获取最后插入的数据

NSString *query = [NSString stringWithFormat:@"SELECT * FROM PHONEBOOK ORDER BY NAME DESC LIMIT 1;"]; 

    // NSLog(@"query : %@",query); 

    BOOL recordExist = [self recordExistOrNot:query]; 

    if (!recordExist) { 

     // save data if no record exists 
    } 




    -(BOOL)recordExistOrNot:(NSString *)query{ 

BOOL recordExist=NO; 

sqlite3_stmt *statement; 
const char *dbpath = [databasePath UTF8String]; 

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




    if (sqlite3_prepare_v2(myDatabase, [query UTF8String], -1, &statement, nil)==SQLITE_OK) 
    { 
     if (sqlite3_step(statement)==SQLITE_ROW) 
     { 
      recordExist=YES; 

      NSString *Name = [[NSString alloc] 
           initWithUTF8String: 
           (const char *) sqlite3_column_text(
                    statement, 0)]; 
      NSString *PhoneNumber = [[NSString alloc] 
            initWithUTF8String: 
            (const char *) sqlite3_column_text(
                     statement, 1)]; 

      //here i need to get the Name and number from the last inserted data 
      NSLog(@"version is %@, type is %@",Name ,PhoneNumber); 
     } 
     else 
     { 
      NSLog(@"%s,",sqlite3_errmsg(myDatabase)); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(myDatabase); 
    } 

} 
return recordExist; 

}

的问题是我没有得到最后插入的数据。我从其他行获取数据(我不确定它是从顶行还是从其他行)。

你能告诉我在这里我做错了什么。

在此先感谢。

+0

这些东西被称为“行”,而不是“列”。 'ORDER BY Name DESC'返回字母顺序最后一个名字的行。 – 2014-09-02 15:00:59

+0

请注意,http://www.sqlite.org/docs.html有一些相当不错的文档(尽管它有点分散)。有几十个SQL教程在线。 – 2014-09-02 15:04:24

如果在插入行后立即执行此操作,则可以使用SQLite C函数sqlite3_last_insert_rowid()获取最后一个插入行的rowid。您也可以使用SQL last_insert_rowid()功能:

SELECT * FROM PHONEBOOK WHERE ROWID = last_insert_rowid() 

注意,你可能要保持SQLite数据库开放要做到这一点(但你不应该打开和关闭数据库的每个SQL语句,反正)。

如果您在稍后的某个日期(例如,用户终止应用程序,明天回来并希望看到最后插入的记录),那么您必须依靠自己的数据库模型来处理那。例如,我经常会在表格中创建/修改/删除时间戳,我每次更新该行的INSERTUPDATE,然后可以根据这些值进行排序。

+0

您是否关闭并重新打开了插入记录和尝试使用此功能之间的数据库?那会导致rowid的丢失。确保你打开数据库。 – Rob 2014-09-02 20:15:30

+0

插入该行后,我不会立即执行此操作。插入行后可以获取行标识,然后使用此标识获取数据? – 2014-09-02 20:27:49

+0

我现在正在获取行ID。我用这个。如果(sqlite3_step(insertStatement)== SQLITE_DONE){ NSLog(@“Contact sucessfully saved:new item id is%lld”,sqlite3_last_insert_rowid(db)); } – 2014-09-02 20:28:35