Невозможно получить и просмотреть результаты из базы данных SQLite - PullRequest
1 голос
/ 01 декабря 2010

Я пытаюсь развить свои навыки в качестве разработчика для iPhone, и в настоящее время я работаю над использованием базы данных SQLite. Я создал таблицу SQLite следующим образом в своем классе GroceryListAppDelegate.m:

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    self.database = [[[ISDatabase alloc] initWithFileName:@"TestDB.sqlite"] autorelease];

if(![[database tableNames] containsObject:@"GroceryItem"]) {

    [database executeSql:@"create table GroceryItem(primaryKey integer primary key autoincrement, name text NOT NULL, number integer NOT NULL)"];
    [database executeSql:@"insert into GroceryItem (name, number) values ('apples', 5)"];
    [database executeSql:@"insert into GroceryItem (name, number) values ('oranges', 3)"];

}

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

}

Я выполняю вызов sql в своем классе RootViewController.m:

- (void)viewDidLoad {
[super viewDidLoad];

GroceryList1AppDelegate *appDelegate = (GroceryList1AppDelegate *)[[UIApplication sharedApplication] delegate];

self.results = [appDelegate.database executeSqlWithParameters:@"SELECT * from GroceryItem where number < ?", [NSNumber numberWithInt:6], nil];

}

Мой метод executeSqlWithParameters () выглядит следующим образом:

- (NSArray *) executeSql:(NSString *)sql withParameters: (NSArray *) parameters {

NSMutableDictionary *queryInfo = [NSMutableDictionary dictionary];
[queryInfo setObject:sql forKey:@"sql"];

if (parameters == nil) {

    parameters = [NSArray array];

}

//we now add the parameters to queryInfo

[queryInfo setObject:parameters forKey:@"parameters"];

NSMutableArray *rows = [NSMutableArray array];

//log the parameters

if (logging) {

    NSLog(@"SQL: %@ \n parameters: %@", sql, parameters);

}

sqlite3_stmt *statement = nil;

if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) {

    [self bindArguments: parameters toStatement: statement queryInfo: queryInfo];

    BOOL needsToFetchColumnTypesAndNames = YES;
    NSArray *columnTypes = nil;
    NSArray *columnNames = nil;

    while (sqlite3_step(statement) == SQLITE_ROW) {

        if (needsToFetchColumnTypesAndNames) {

            columnTypes = [self columnTypesForStatement:statement];
            columnNames = [self columnNamesForStatement:statement];
            needsToFetchColumnTypesAndNames = NO;

        }

        id row = [[NSMutableDictionary alloc] init];
        [self copyValuesFromStatement:statement toRow:row queryInfo:queryInfo columnTypes:columnTypes columnNames:columnNames];
        [rows addObject:row];
        [row release];

    }       

}

else {

    sqlite3_finalize(statement);
    [self raiseSqliteException:[[NSString stringWithFormat:@"failed to execute statement: '%@', parameters: '%@' with message: ", sql, parameters] stringByAppendingString:@"%S"]];

}

sqlite3_finalize(statement);
return rows;

}

Когда я строю и запускаю свой код, я не получаю никаких результатов, хотя на самом деле, учитывая мой SQL-вызов, я должен получить яблоки и апельсины в моем списке. Однако, когда я изменяю свой sql-код следующим образом:

self.results = [appDelegate.database executeSql:@"SELECT * from GroceryItem"];

Который вызывает другой метод: executeSql ():

- (NSArray *) executeSql: (NSString *)sql {

return [self executeSql:sql withParameters: nil];

}

В этом случае я получаю результаты: яблоки и апельсины. Почему это? Что я делаю неправильно? Почему я получаю результаты одного вызова SQL, а не другого?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2010

Большое спасибо за вашу помощь, но я нашел решение.Проблема была в моей функции bindArguments ():

- (void) bindArguments: (NSArray *) arguments toStatement: (sqlite3_stmt *) statement queryInfo: (NSDictionary *) queryInfo {

именно там, где у меня был оператор связывания для чисел:

else if ([argument isKindOfClass:[NSNumber class]])
        {
            sqlite3_bind_double(statement, -1, [argument doubleValue]);
        }

Мне нужно было изменить -1 на i.Эта переменная сообщает SQL, какую переменную я собираюсь заменить в операторе.Так что в этом случае у нас есть только одна переменная, представленная?и он должен быть заменен на 5.

0 голосов
/ 01 декабря 2010

Если вы извлекаете файл .sqlite из симулятора или устройства и открываете его в командной строке с помощью sqlite3, работает ли запрос?Это позволит вам отдельно протестировать код создания базы данных и код запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...