2011-07-16 8 views
2

私はiPadアプリケーション用のデータインポートルーチンを作成中です。それは正常に動作しているようです。しかし、私はIOSの知識があり、SQLサーバへの呼び出しによってそのようなタスクが処理されるアプリケーション開発のバックグラウンドから来ているため、正しいアプローチを使用しているかどうかを再確認する必要があります。キーポイントのIOSデータインポート戦略/デザイン

// SET UP SOME VARIABLES/VALUES APPLICABLE TO ALL IMPORTS 

NSStringEncoding encoding = 1; 

NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; 

NSString* file = nil; 

NSError* error = nil; 

NSArray* records = nil; 

NSArray* fields = nil; 

NSPredicate* predicate = nil; 

NSArray* filteredArray = nil; 

// IMPORT GEO DATA 
// ProvinceState 

file = [[NSBundle bundleForClass:[self class]] pathForResource:@"ProvinceState" ofType:@"txt"]; 

error = nil; 

records = [NSArray arrayWithContentsOfCSVFile:file usedEncoding:&encoding error:&error]; 

NSManagedObject* provinceState = nil; 

NSMutableArray* provinceStateArray = [NSMutableArray arrayWithCapacity:[records count]]; 

for (int i = 0; i < [records count]; ++i) 
{ 
    fields = [records objectAtIndex:i]; 

    if ([fields count] == 2) 
    { 

     provinceState = [NSEntityDescription insertNewObjectForEntityForName:@"ProvinceState" inManagedObjectContext:self.managedObjectContext]; 

     [provinceState setValue: [numberFormatter numberFromString:[fields objectAtIndex:0]] forKey:@"id"]; 

     [provinceState setValue:[fields objectAtIndex:1] forKey:@"name"]; 

     [provinceStateArray addObject:provinceState]; 

    } 
} 

カップル:

は、ここで私は私のマスターデータエンティティの1にデータをインポートするために使用している基本的なアプローチです。この特定のエンティティは非常に単純です。整数IDと文字列名だけです。ソーステーブルはシンプルなcsvファイルです。メソッドarrayWithContentsOfCSVFile:usedEncoding:error:は、Dave Delongの優れたCHCSVパーサからのものであり、これは構文解析を容易にします。私は最初に基本的なテクニックを試してみるため、エラー処理をまだ適用していません。

この単純なコードで何か間違った点が見つからない限り、今私の主な質問に取り掛かります。上記のコードの最後の意味のある行で参照されているprovinceStateArrayは、トランザクションデータの関係にそれらを取り込む必要があるときに、後でマスターデータエンティティをクエリする手間を省くためです。私はこれがa)私の記憶の必要性を増やし、b)関連するオートリリープールを排除することから私を防いだが、半ダース程度のマスターデータエンティティには合計でわずか数百の小さなオブジェクトが含まれていたので、これは懸念事項でした。誰もが違うと思う?

ここで私に関係する部分です。次のような場所エンティティを移入する次のコードでは、私はこれらの同じマスターデータエンティティアレイを使用しています:

file = [[NSBundle bundleForClass:[self class]] pathForResource:@"Location" ofType:@"txt"]; 

error = nil; 

records = [NSArray arrayWithContentsOfCSVFile:file usedEncoding:&encoding error:&error]; 

NSManagedObject* location = nil; 

NSMutableArray* locationArray = [NSMutableArray arrayWithCapacity:[records count]]; 

for (int i = 0; i < [records count]; ++i) 
{ 
    NSArray* fields = [records objectAtIndex:i]; 

    if ([fields count] == 5) 
    { 

     location = [NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:self.managedObjectContext]; 

     [location setValue: [numberFormatter numberFromString:[fields objectAtIndex:0]] forKey:@"id"]; 

     predicate = [NSPredicate predicateWithFormat:@"id = %@", [numberFormatter numberFromString:[fields objectAtIndex:1]]]; 

     filteredArray = [provinceStateArray filteredArrayUsingPredicate:predicate]; 

     if ([filteredArray count] > 0) 
     { 
      [location setValue:[filteredArray objectAtIndex:0] forKey:@"provinceState"]; 
     } 

を...というように上下に設定されている必要があり、他の関係主体による。

これは、私が何か他の選択肢を見ていないにもかかわらず、関係を設定するために大量のオブジェクトを構築しなければならない部分です。

また、ソースデータはRDBMSからのものであるため、セットを反復するのではなく、1対多の関係の片側にデータを挿入しています。

このすべてで何か悪臭がでますか、または私が理解するいくつかの快適さを持ち続けることができますか?

ウェイン

答えて

0

私はSQLiteのデータベースを作成し、そのデータベースへのファイルから、プロジェクトおよびインポートデータにインポートする方がよいと思います(それは、ハードドライブメモリ)、RAMにアレイにありません。その後、データベースを使用できる状態になったら、クエリを実行して、ユーザーの必要なデータのみをiPhone RAMに保存します。

+0

@wzbozon ...私は何かを明確にしておくべきだった。データはCore Dataで終わらなければならないので、SQLiteに対して直接作業することは選択肢ではありません。また、データはcsvファイルとしてのみ私に届いているので、csv-to-Core-Dataのインポートを避ける方法はわかりません。もちろん、データがコアデータ(この場合はSQLiteに格納されています)に格納されると、ユーザクエリは必要なデータのみを抽出します。しかし、私はまだそれを取得する必要があります。 – wayne