【问题标题】:Unable to retrieve and view results from a SQLite database无法从 SQLite 数据库检索和查看结果
【发布时间】:2010-11-30 23:16:30
【问题描述】:

我正在努力培养我作为 iPhone 开发人员的技能,目前我正在使用 SQLite 数据库。我在 GroceryListAppDelegate.m 类中创建了一个 SQLite 表,如下所示:

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

}

我在我的 RootViewController.m 类中进行了 sql 调用:

- (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 调用而不是另一个 SQL 调用获得结果?

【问题讨论】:

    标签: iphone objective-c database sqlite


    【解决方案1】:

    如果您从模拟器或设备中提取 .sqlite 文件并使用sqlite3 在命令行中打开它,查询是否有效?这将使您能够分开测试您的数据库创建代码和查询代码。

    【讨论】:

    • 非常感谢您的回复。但是如何从模拟器中提取 .sqlite 文件,并使用 sqlite3 在命令行中打开它?再次感谢您的帮助。
    【解决方案2】:

    非常感谢您的所有帮助,但我找到了解决方案。问题出在我的 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 代替。

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 2021-08-15
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2014-12-20
      • 2015-01-11
      相关资源
      最近更新 更多