0
-(NSMutableArray*) fetchMakeNamesYear1:(int) year1 Year2:(int) year2 compileStaement:    (sqlite3_stmt*)compiledStatement
{
    NSMutableArray *makeNames=[NSMutableArray array];
    NSString *selectQuery=[NSString stringWithFormat:@"SELECT DISTINCT Make FROM Inventory  WHERE   [Year] BETWEEN 2009 AND 2012 AND Make IS NOT NULL ORDER BY Make",year1 ,year2 ];
//   if (sqlite3_exec(((StorageManager*)[StorageManager sharedStorageManager]).database,  [selectQuery cStringUsingEncoding:NSUTF8StringEncoding], NULL, NULL, NULL) == SQLITE_OK) 
//   {
//       
//   }
    if(sqlite3_prepare_v2(((StorageManager*)[StorageManager sharedStorageManager]).database,  [selectQuery UTF8String] , -1, &compiledStatement, NULL) != SQLITE_OK) 
    {
        return nil;

    }
    while (sqlite3_step(compiledStatement) == SQLITE_ROW)
   {

        NSLog(@"return TYpe: %d",sqlite3_column_type(compiledStatement, 5));

        if (sqlite3_column_text(compiledStatement, 5)!= NULL)
        { 
            **NSString *makeName = [NSString  stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];**
            [makeNames addObject:makeName];

        } 
       sqlite3_reset(compiledStatement);   
}
[self finalize:compiledStatement];

return  makeNames  ;

}

sqlite3_column_text(compiledStatement, 5) によって返される値は NULL です。

私のデータベースでは、5 番目の列のデータ型は nvarchar[50] です。

その列名は「Make」です

私のテーブル名は「Inventory」です

上記の例では、to および from year の値をハードコーディングしています。

sqlite manager で同じ sql クエリを試したところ、すべての make 名のデータが表示されていることがわかりました。また、sqlite3_column_type(compileStatement,5) が 5 (SQLITE_NULL 5) を返すこともわかりましたが、私の列の種類によれば、3 (SQLITE_TEXT 3) である必要があります。

誰かが上記の行動についての洞察を与えることができますか?

4

3 に答える 3

1

sqlite3_column_text() で間違った列インデックスを使用しています - 列 5 はクエリに存在しません。代わりに 0 を試してください ( SQLite ドキュメントを参照)

于 2012-06-12T10:27:59.740 に答える
1
-(NSMutableArray*) fetchMakeNamesYear1:(int) year1 Year2:(int) year2 compileStaement:    (sqlite3_stmt*)compiledStatement
{
NSMutableArray *makeNames=[NSMutableArray array];
NSString *selectQuery=[NSString stringWithFormat:@"SELECT DISTINCT Make FROM Inventory  WHERE   [Year] BETWEEN 2009 AND 2012 AND Make IS NOT NULL ORDER BY Make",year1 ,year2 ];
//   if (sqlite3_exec(((StorageManager*)[StorageManager sharedStorageManager]).database,  [selectQuery cStringUsingEncoding:NSUTF8StringEncoding], NULL, NULL, NULL) == SQLITE_OK) 
//   {
//       
//   }
if(sqlite3_prepare_v2(((StorageManager*)[StorageManager sharedStorageManager]).database,  [selectQuery UTF8String] , -1, &compiledStatement, NULL) != SQLITE_OK) 
{
    return nil;

}
while (sqlite3_step(compiledStatement) == SQLITE_ROW)
{

    NSLog(@"return TYpe: %d",sqlite3_column_type(compiledStatement, 0));

    if (sqlite3_column_text(compiledStatement, 0)!= NULL)
    { 
        **NSString *makeName = [NSString  stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];**
        [makeNames addObject:makeName];

    } 
   sqlite3_reset(compiledStatement);   
}
[self finalize:compiledStatement];

return  makeNames  ;

}
于 2012-06-12T10:47:20.993 に答える