1

値がブール値に設定されているNSManagedObjectサブクラスで問題が発生していますが、プリミティブ型は常に整数のようです。

問題を説明するシナリオは次のとおりです。

NSNumberのプリミティブ型をチェックするメソッドがある場合、次のようになります。

- (BOOL) numberIsBool:(NSNumber*)numberToCheck {

   const char *primitiveType = [numberToCheck objCType];

   return (strcmp(primitiveType, @encode(BOOL)) == 0 );
 }

そして、私は次のコードを実行します:

NSNumber *num = [NSNumber numberWithBool:YES];

BOOL isBool = [self numberIsBool:num];

予想どおり、primitiveTypeは "c"になり、isBoolはYESになります。

ただし、NSManagedObjectサブクラスを取得すると、次のようになります。

@interface MyClass : NSManagedObject

@property (nonatomic, retain) NSNumber *myBoolValue;
...
@end

ここで、myBoolValueはモデルでブール型に設定されており、次のコードを実行します。

MyClass *myClass = ... (create from NSManagedObjectContext)

myClass.myBoolValue = [NSNumber numberWithBool:YES];

BOOL isBool = [self numberIsBool:num];

primitiveTypeは"i"に設定され、isBoolはNOになります

誰かが私にこれの理由またはそれが設定されたプリミティブ型を尊重するためにmyBoolValueプロパティを取得する方法を説明できますか?

編集:だから、私が達成しようとしていることに混乱はありません-私はNSNumberをブール値に変換しようとはしていません。私はすでにこれをで行う方法を知っています [myBoolValue boolValue]

編集#2-より明確にする:NSManagedObjectのプロパティを調べる場合。プロパティがNSNumberであり、その値が1または0の場合、ブール値であることが意図されている場合と整数であることが意図されている場合は、異なるコードパスを使用する必要があります。

4

2 に答える 2

0

CoreDataはBOOLをNSNFCNumbersとして保存します。それをBOOLのように扱うには、この変換を行うことができます BOOL myBool = [[NSString stringWithFormat@"%@", (NSInteger)[myManagedObject valueForKey:@"myAttribute"]]intValue] == 1;

Appleフォーラムで解決策を見つけました

https://discussions.apple.com/thread/2169600?start=0&tstart=0

編集

これはCoreDataに格納されているBOOLのタイプであるため、 primitiveTypeをNSCFBooleannumberIsBoolと比較する必要があります。

于 2012-04-15T18:32:44.480 に答える
0

@Nikitaが見つけた投稿のおかげで、これがNSManagedObjectの欠点であることがわかったので、問題の解決策を見つけました。

- (BOOL) property:(NSString*)propertyName ofObjectIsBoolean:(NSObject*)object {
     BOOL isBoolean = NO;

     if ([object respondsToSelector:@selector(entity)]) {

         NSEntityDescription *description = [object entity];

         NSDictionary *attributes = [description attributesByName];

         NSAttributeDescription *attributeDescription = [attributes objectForKey:propertyName];

         NSAttributeType attributeType = [attributeDescription attributeType];

         isBoolean = (attributeType == NSBooleanAttributeType);
      else {

         const char *primitiveType = [numberToCheck objCType];

         isBoolean = (strcmp(primitiveType, @encode(BOOL)) == 0 );
      }

      return isBoolean;
}
于 2012-04-16T02:10:49.127 に答える