我在应用程序中使用sqlite数据库。在我的sqlite中存在10条记录。我想从该数据库中读取4个数据,并且要获取此数据,直到最后一个数据中的BroID为NULL(BroID是列数据之一),这是我的代码,但是我不知道如何在代码中使用循环,直到BroID为空值。

    -(NSMutableArray *)readInformationFromDatabase
    {
        array = [[NSMutableArray alloc] init];

        // Setup the database object
        sqlite3 *database;
        // Open the database from the users filessytem
        if(sqlite3_open([[self dataFilePath] UTF8String], &database) == SQLITE_OK)
        {
// I want to use loop for certain work!!! (this work is get name from data base until BroID to be NULL )
            NSString *sqlStatement_userInfo =[NSString stringWithFormat:@"Select * from table1"];
                sqlite3_stmt *compiledStatement;
                if(sqlite3_prepare_v2(database, [sqlStatement_userInfo UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
                {
                    // Loop through the results and add them to the feeds array
                    while(sqlite3_step(compiledStatement) == SQLITE_ROW)
                    {
                        // Init the Data Dictionary
                        NSMutableDictionary *_dataDictionary=[[NSMutableDictionary alloc] init];
                        NSString *_userName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                        [_dataDictionary setObject:[NSString stringWithFormat:@"%@",_userName] forKey:@"Name"];

                        [array addObject:_dataDictionary];
                    }
                }
                else
                {
                    NSLog(@"No Data Found");
                }

请让我知道完成此代码的方法。

最佳答案

首先确定SELECT语句:

  • 将语句从SELECT * ...更改为SELECT colname1, colname2, ...,这样您就可以确定返回列的顺序,并且不必参考架构即可找出返回的顺序。这实际上节省了时间。
  • BroID必须包含在所选列中。
  • 您需要ORDER BY子句以获得一致的结果。
  • 您可能可以使数据库仅包含WHERE BroID IS NOT NULL行,这可能适合您的需求。

  • 如果仍然需要使用代码来停止获取,则只需使用以下命令从NULL BroID循环中测试break列和while:
    while (sqlite3_step(compiledStatement) == SQLITE_ROW)
    {
        // Fetch other columns
        if (sqlite_column_type(compiledStatement, INDEX) == SQLITE_NULL)
            break;
    }
    

    其中INDEXBroID的列索引。

    目前尚不清楚是否要在结果集中的BroID IS NULL行所在的位置;如果您不这样做,则在访存列之前不执行sqlite_column_type()测试,否则将其保留如上。

    有关详细信息,请参考reference

    关于ios - 如何在sqlite中使用循环从某些列获取名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16621281/

    10-10 07:23