从sqlite中选择数据iOS有时会出现null语句

时间:2016-05-06 15:18:32

标签: ios sqlite

我从sqlite数据库中选择数据。问题是使用以下代码它有一段时间。但是让我们说我们为任何其他表调用此方法两次,然后它为其他方法显示null select语句。在方法中有任何问题,以便如果我们在其他表中使用相同的时间,它有时会工作。

-(void)getAssessmentNumber:(NSString *)dbPath{
    appDelegate=[[UIApplication sharedApplication]delegate];
    NSString*fileDBPath=[[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];
    if (sqlite3_open([fileDBPath UTF8String], &database) == SQLITE_OK)
    {
        //  NSLog(@"%@",[self getDBPath]);
        NSString *querySQL = [NSString stringWithFormat:@"Select Am.AssessmentID , Am.AssessmentName From AssessmentMaster Am LEFT JOIN AssessmentDepartmentMapping M ON M.AssessmentID = Am.AssessmentID LEFT JOIN DepartmentListing d ON d.departmentID =M.departmentID where d.departmentID = '%@'",appDelegate.departmentID];
        NSLog(@"%@",querySQL);
        const char *sql = [querySQL UTF8String];
        sqlite3_stmt *selectstmt;
        NSError *error;
        [appDelegate.assessmentNumberArray removeAllObjects];

        if (sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(selectstmt) == SQLITE_ROW)
            {
                NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
                AssessmentListening   *asmObj = [[AssessmentListening alloc] initWithPrimaryKey:primaryKey];
                asmObj.assessmentID=[NSString stringWithFormat:@"%d",primaryKey];

                asmObj.assessmentName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];

                [appDelegate.assessmentNumberArray addObject:asmObj];
            }
        }
        else {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }

        //  sqlite3_finalize(selectstmt);
    }
    sqlite3_close(database);
}

从表中获取数据是否合适?

1 个答案:

答案 0 :(得分:1)

您的代码需要一点清理。

- (void)getAssessmentNumber:(NSString *)dbPath {
    NSString *fileDBPath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];
    if (sqlite3_open([fileDBPath UTF8String], &database) == SQLITE_OK) {
        appDelegate = [[UIApplication sharedApplication] delegate];
        [appDelegate.assessmentNumberArray removeAllObjects];

        const char *sql = "Select Am.AssessmentID, Am.AssessmentName From AssessmentMaster Am LEFT JOIN AssessmentDepartmentMapping M ON M.AssessmentID = Am.AssessmentID LEFT JOIN DepartmentListing d ON d.departmentID = M.departmentID where d.departmentID = ?";
        sqlite3_stmt *selectstmt;

        if (sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
            sqlite3_bind_text(selectstmt, 0, [appDelegate.departmentID UTF8String], -1, SQLITE_TRANSIENT);

            while (sqlite3_step(selectstmt) == SQLITE_ROW) {
                NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
                AssessmentListening *asmObj = [[AssessmentListening alloc] initWithPrimaryKey:primaryKey];
                asmObj.assessmentID = [NSString stringWithFormat:@"%d", primaryKey];

                asmObj.assessmentName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];

                [appDelegate.assessmentNumberArray addObject:asmObj];
            }

            sqlite3_finalize(selectstmt);
        } else {
            NSLog(@"Unable to prepare statement: %s", sqlite3_errmsg(database));
        }

        sqlite3_close(database);
    } else {
        NSLog(@"Unable to open the database from %@: %s", fileDBPath, sqlite3_errmsg(database);
    }
}

请注意所有更改:

  1. 仅在数据库打开时关闭数据库。
  2. 只有在准备好的情况下才能完成声明。
  3. 不要使用stringWithFormat构建查询。使用正确的sqlite3_bind_xxx函数将值绑定到查询。这可以确保转义特殊字符并正确处理引用。
  4. 使用正确的错误检查。使用sqlite3_errmsg来获取错误。