Objective c 在获取数据时,始终只从sqlite数据库获取第一个值

Objective c 在获取数据时,始终只从sqlite数据库获取第一个值,objective-c,sqlite,Objective C,Sqlite,这就是我创建数据库的方式 #import "DBManager.h" static DBManager *sharedInstance = nil; //Class Object static sqlite3 *database = nil; // Sqlite3 database object static sqlite3_stmt *statement = nil; // sql query object @implementation DBManager +(DBManager*)g

这就是我创建数据库的方式

#import "DBManager.h"

static DBManager *sharedInstance = nil; //Class Object
static sqlite3 *database = nil; // Sqlite3 database object
static sqlite3_stmt *statement = nil; // sql query object

@implementation DBManager

+(DBManager*)getSharedInstance{
    if (!sharedInstance) {
        sharedInstance = [[super allocWithZone:NULL]init]; //memory allocation
        [sharedInstance createDB];
    }
    return sharedInstance;
}
这就是我将数据插入数据库的方式

-(BOOL)createDB{

    NSLog(@"createDB");

    NSFileManager *nsFileManager = [NSFileManager defaultManager];
    NSArray *array =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSLog(@"document directory: %@",array);

    NSString *documentPath = [array objectAtIndex:0];

    NSLog(@"documentPath: %@",documentPath);

    databasePath = [documentPath stringByAppendingString:@"/Database"];

    if (![nsFileManager fileExistsAtPath:databasePath]) {
        [nsFileManager createDirectoryAtPath:databasePath withIntermediateDirectories:NO attributes:nil error:nil];
    }

    NSLog(@"database path : %@",databasePath);

    //NSLog(@"imageData : %@",imageData);
    databasePath = [databasePath stringByAppendingString:@"/database.db"];
    NSLog(@"databaseFilePath : %@",databasePath);
    BOOL isSuccess = YES;

    if (![nsFileManager fileExistsAtPath:databasePath]) {
        const char *dbpath = [databasePath UTF8String];

        NSLog(@"dbpath : %s",dbpath);

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

            NSLog(@"database creation successfull");
            char *errMsg;
            const char *sql_stmt = "create table if not exists buddyMessage (message text)";

            NSLog(@"sql is %s",sql_stmt);

            if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)

            {
                isSuccess = NO;
                NSLog(@"Failed to create table : %s",errMsg);

            }
            else{
                NSLog(@"table successful creation");
            }

            sqlite3_close(database);
            return isSuccess;
        }
    }
    return isSuccess;

}
这里我使用一个可变数组resultarray,在其中我添加了名称,但当我使用以下方法获取数据时,每次都从数据库中获取第一个元素。每次输入NSLog resultarray时,它都会显示数据库中的第一个值

-(void)insertText:(NSString *)messageText{
    NSLog(@"insertBuddyMessages : %@",databasePath);

    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK){
        NSLog(@"database open");
        NSString *insertSQL = [NSString stringWithFormat:@"insert into buddyMessage (message) values (\"%@\")",messageText];
        const char *insert_stmt = [insertSQL UTF8String];

        NSLog(@"insert_stmt : %s",insert_stmt);
        sqlite3_prepare_v2(database, insert_stmt,-1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            NSLog(@"inserted ");
        }
        else {
            NSLog(@"error");
        }
    }


}

您必须在循环中调用
sqlite3\u步骤
,并在每次迭代中填充数组

- (NSArray*) findmessage:(NSString*)message;
{
    const char *dbpath = [databasePath UTF8String];
    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat:
                              @"select message from buddyMessage"];
        const char *query_stmt = [querySQL UTF8String];
        NSMutableArray *resultArray = [[NSMutableArray alloc]init];
        if (sqlite3_prepare_v2(database,
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(statement) == SQLITE_ROW)
            {
                NSString *name = [[NSString alloc] initWithUTF8String:
                                  (const char *) sqlite3_column_text(statement, 0)];
                [resultArray addObject:name];
                 NSLog(@"array is %@",resultArray);
                 NSLog(@"array count %lu",(unsigned long)[resultArray count]);
                  NSString *last = [resultArray lastObject];
             NSLog(@"last is %@ ",last);

           // [[NSUserDefaults standardUserDefaults] setObject:last forKey:@"preferenceName"];
           // [[NSUserDefaults standardUserDefaults] synchronize];

            NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

            // saving an NSString
            [prefs setObject:last forKey:@"keyToLookupString"];

            NSLog(@"prefs is %@", prefs);

            }
            else{
                NSLog(@"Not found");
               // return nil;
            }
            sqlite3_reset(statement);
        }
    }
    return nil;
}


@end

你的问题不是很清楚。你的实际问题是什么?我想你是在问如何获得所有的信息,而不仅仅是一条信息。是这样吗?这解决了我的问题,现在我得到了所有的数据,从中我得到了我想要的最后一个对象我已经更新了代码,现在我只想在文本字段中显示该值,我将如何更新showViewController的代码,我正在尝试显示该值。
while (sqlite3_step(statement) == SQLITE_ROW) {
    // store value here
}