0

ARCを使用してDynamoDBにバックアップするCoreDataを使用するiOSプログラムがあります。

その中に、次のクラスが宣言されたデータモデルがあります。

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Track : NSManagedObject

@property (nonatomic, retain) NSString * trackId;

@end

-------------------------------------------------

#import "Track.h"


@implementation Track

@dynamic trackId;

@end

次に、ManagedObjectのインスタンスを作成し、次のように永続化するクラスがあります。

NSString *trackId = @"ABC123";

Track *track = (Track*)[NSEntityDescription insertNewObjectForEntityForName:@"Track" inManagedObjectContext:context];
track.trackId=trackId;

NSError *error;
if (![appDelegate.managedObjectContext save:&error])
{
    NSLog(@"error: %@", error);
}

これは期待どおりに機能します。ただし、スイッチを使用して同じものを実装し、trackIdの値を次のように変更すると、次のようになります。

for (int i=0; i<1; i++) {
    NSString *trackId;
    switch (i) {
        case 0:
            trackId = @"XYZ789";
            break;
    }

    Track *track = (Track*)[NSEntityDescription insertNewObjectForEntityForName:@"Track" inManagedObjectContext:context];
    track.trackId=trackId;
}

NSError *error;
if (![appDelegate.managedObjectContext save:&error])
{
    NSLog(@"error: %@", error);
}

次に、次の例外が発生します。

2013-01-16 14:44:00.013 DjTest2[2351:c07] XYZ789
2013-01-16 14:44:00.014 DjTest2[2351:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
*** First throw call stack:
(0x183e012 0x1663e7e 0x18c10de 0x107c9bf 0x39799 0x1ff5e4 0xc7831 0xf533c 0x3411 0x68c817 0x68c882 0x5dba25 0x5dbdbf 0x5dbf55 0x5e4f67 0x5a8fcc 0x5a9fab 0x5bb315 0x5bc24b 0x5adcf8 0x268bdf9 0x268bad0 0x17b3bf5 0x17b3962 0x17e4bb6 0x17e3f44 0x17e3e1b 0x5a97da 0x5ab65c 0x258d 0x24b5)
libc++abi.dylib: terminate called throwing an exception

NSStringリテラルがスイッチのスコープ内に作成されるARCを使用した変数のスコープ/保持に関して、私が気付いていない問題があると思いますが、それへの参照が見つかりません。

これの根本的な原因が何であるか、そしてそのような操作を実行することができずに多数のオブジェクトを永続化することに効率的に対処する方法を誰かが知っていますか?

注:完全を期すためにDynamoDBに戻ることについて説明しましたが、AWSを呼び出そうとする前に、この例外が発生します。

4

1 に答える 1

0

SOに入るときに明確にするために更新した上記のコード例で、私たちを迷わせてしまったことを恐れています。

実際の問題は、switch ステートメント内にあるということではなく、使用している実際のキーの一部にスペースが含まれており、DynamoDB にはそのような制限がないため、Core Data によって制限されていると想定しています。

于 2013-01-16T16:03:16.147 に答える