0

次のコード

  NSMutableString *a = [[NSMutableString alloc] init];
  NSMutableString *pivot     =[[NSMutableString alloc] init];
    int i= 0;

    for ( i = 0; i < [columns count]; i++)
    {


        if ([[[data objectForKey:pivot] class] isKindOfClass:[NSNumber class]])
        {
             sqlite3_bind_int(sqlStatement, i+1,[[columns objectAtIndex:i] integerValue]);

        }
        else
        {
            // NSLog(@"kind of class %@ %@",NSStringFromClass([[data objectForKey:pivot] class]) ,[data objectForKey:pivot]);
            [pivot setString:[columns objectAtIndex:i]];
            [a setString:(NSString*)[data objectForKey:pivot]];
            sqlite3_bind_text(sqlStatement, i+1, [a UTF8String], -1, 0);

        }
    }
    a     = nil;
    pivot = nil;

例外を発生させます

 kind of class __NSCFConstantString
  -[__NSCFNumber length]: unrecognized selector sent to instance 0xc94c240

しかし、ログはそれが文字列であることを明確に示しています[data objectForKey:pivot]! そして、test変数は常に 0 です!

デバッグをチェックインしましたが、実際に [data objectForKey:pivot]は数値です。そして実際には、if(図示せず)を使用して、それが数値かどうかを確認します。明らかに、if失敗...

4

1 に答える 1

1

classこの方法でフォーマットしようとすると、文字列にキャストされます。クラスから文字列名を取得してみてNSStringFromClass(class)ください。

 id pivotObject = [data objectForKey:pivot];
 NSLog(@"kind of class %@", NSStringFromClass([pivotObject class]));
 if ([pivotObject isKindOfClass:[NSString class]]) {
     [pivot setString:[columns objectAtIndex:i]];
     [a setString:pivotObject];
 }

また、はnotをisKindOfClass:返します。BOOLint

しかし、最も重要なこと:

[pivot setString:[columns objectAtIndex:i]]ここでピボット変数を変更してからデータから取得するため、行のエラーだと思いますが、ピボット変数が変更されているため、データ辞書から別のキーを要求します。これにより、別の値が得られます。私のコード データから pivotData を一度だけ取得します。

于 2013-10-22T09:40:27.890 に答える