objective-c - 当我获取数据时,始终仅从sqlite数据库中获取First值

标签 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*)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;

}


这就是我将数据插入数据库的方式

-(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");
        }
    }


}


在这里,我正在使用Mutable array resultarray,在其中添加名称,但是当我使用以下方法获取数据时,每次都会从数据库中获取第一个元素。当我每次NSLog resultArray时,它都会显示数据库中的firstvalue。

- (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

最佳答案

您必须循环调用sqlite3_step并在每次迭代中填充数组。

while (sqlite3_step(statement) == SQLITE_ROW) {
    // store value here
}

关于objective-c - 当我获取数据时,始终仅从sqlite数据库中获取First值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392977/

相关文章:

ios - 自定义单元格和 dequeueCellWithIdentifier 中的 UIGestureRecognizer 冲突

objective-c - UILocalNotification 每周六 12 点 :00 am

php - 无法写入只读 SQLite 数据库文件

ios - 使用 FMDB for SQLite 库如何像 Core Data 的 controllerDidChangeContent 一样自动更新 TableView

android - 从 sqlite 触发器调用 Java 方法 (android)

java - 在 Gson 的帮助下将 java 对象存储为共享首选项,而不是使用 SQLite? (安卓)

objective-c - 在 NSNotification 中传递 int 作为 "object"

ios - 多次调用 block 显示 View 中的 UIAlertView

ios - 使用 NSFetchedResultsController 创建表格部分

c++ - 根据第一个表的信息选择第二个表时如何短语sql查询