質問

現在、コアデータを使用するためのアプリを更新しています。あなたが言うことができるアプリは「データベースビューア」です、一度に閲覧することができるデータベースは1つだけです。各データベースは独自の別のフォルダに保存されています。現在データはダウンロードされ、一連のPlistファイルとして保存されます。

新しいバージョンでは、これらのPlistデータベースをコアデータストアに変換する必要があります(各データベースの1つのストア。)私は既に別々のストアファイルを作成し、エンティティをクレイティを設定します。問題は、すべてのエンティティが作成された最初のデータベースに保存され、「現在の」ファイルまたは「最後に作成された」ファイルには保存されます。

私が使用している基本的なプロセスは次のとおりです。

//For each database {
//Create the sqlite file and set up NSManagedObjectContext
[MagicalRecord setupCoreDataStackWithStoreNamed:
    [NSURL fileURLWithPath:
    [NSString stringWithFormat:@"%@/%@/%@.sqlite",
    dirPath, directory, directory]]];
NSManagedObjectContext *managedObjectContext = 
    [NSManagedObjectContext MR_contextForCurrentThread];

//Iterate through all the plist files and create the necessary entities.
//Save new entities to file
[managedObjectContext MR_save];
//Clean up all cashes
[MagicalRecord cleanUp];
}
.

各スイッチ間のすべてのものを本質的に「リセットする」という店舗を正しく切り替える方法。好ましくは(可能であれば)魔法の記録を使用する。

編集: 問題の一部を発見し、ほとんどの不要な行動を削除しました。それは現れ、バックグラウンドスレッドで[MagicalRecord cleanUp]を確実に呼び出すことはできません。また、それは私がそれがあるべきことをしていることではありません(下記参照)。コアデータスタックをリセットするには、各「保存」の後にメインスレッドに電話をかけました。これを実行すると、最初の3つのデータベースの新しいコンテキストが作成されます。その後、データベースから3つのデータベースを前に複製します。そのため、ループに同じ3つのコンテキストが使用されています。

これは私が持っているものです。 バックグラウンドスレッドを作成し、バックグラウンドでコードを実行してコードを実行します。

backgroundQueue = dispatch_queue_create("com.BrandonMcQuilkin.myQueue", NULL);
    dispatch_async(backgroundQueue, ^(void) {
        [self createSQLiteDatabase:updateList];
    });
.

スタックとデータベースを作成する:

- (void)createSQLiteDatabase:(NSArray *)updateList
{
    NSString *directory = [updateList objectAtIndex:0];
    [MagicalRecord setupCoreDataStackWithStoreNamed:
        [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/%@/%@.sqlite",
        dirPath, directory, directory]]];
    NSManagedObjectContext *managedObjectContext = 
        [NSManagedObjectContext MR_contextForCurrentThread];
    //Check to see if the stack has reset
    NSLog(@"Before:%i", [[Competition MR_findAllInContext:managedObjectContext] count]);

    //Create and add entities to context...

    //Prepare for next loop
    NSLog(@"After:%i", [[Competition MR_findAllInContext:managedObjectContext] count]);
    [managedObjectContext MR_saveNestedContexts];
    [NSManagedObjectContext MR_resetContextForCurrentThread];

    NSMutableArray *temp = [[NSMutableArray alloc] initWithArray:updateList];
    [temp removeObjectAtIndex:0];

    dispatch_async(dispatch_get_main_queue(), ^(void){
        [self shouldContinueUpdating:temp];
    });
.

をリセットしてすべてのデータベースに対して繰り返します。

- (void)shouldContinueUpdating:(NSArray *)databases
{
    //preform cleanup on main thread and release background thread
    [MagicalRecord cleanUp];
    dispatch_release(backgroundQueue);

    if ([databases count] != 0) {
        backgroundQueue = dispatch_queue_create("com.BrandonMcQuilkin.myQueue", NULL);
        dispatch_async(backgroundQueue, ^(void) {
            [self createSQLiteDatabase:databases];
        });
    }
}
.

2つのnslogを使用すると、このコンソールでこれを取得します。(6つのデータベースを使用して、データベースが変換するデータベース数に関係なく、パターンは同じです。)

//First Loop
Before:0
After:308
//Second Loop
Before:0
After:257
//Third Loop
Before:0
After:37
//Fourth Loop
Before:308 
After:541 
//Fifth Loop
Before:257
After:490
//Sixth Loop
Before:37
After:270
... Keep adding to each of the three contexts.
.

[MagicalRecord cleanUp]は、それがやっていると言うことをしていません。これがどのような方法があるべきことです。

+ (void) cleanUpStack;
{
[NSManagedObjectContext MR_cleanUp];
[NSManagedObjectModel MR_setDefaultManagedObjectModel:nil];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:nil];
[NSPersistentStore MR_setDefaultPersistentStore:nil];
}
.

しかし、私が保存するたびにNSStoreCoordinatorは同じコーディネーターで、同じメモリの場所で同じコーディネーターであり、各ストアはぶら下がっています。何かがうまくいかない...

役に立ちましたか?

解決 2

私が魔法の巣のバグが原因である問題を判明しています。ここでGitの問題を送信しました: https://github.com/magicalpanda/magicalrecord/issues/270

他のヒント

MagicalRecordはあなたのためにこの仕事のための最良のツールではないかもしれません...

最初に、SetupCoreDataCKWithWithStoreNamed:メソッドの使用方法を修正しましょう。このパラメータは、URLではなくNSSTRING、またはファイルパスを取ります。 MagicalRecordはあなたのために適切な道を選び、そこにあなたの店を作成します。結果として得られるSQLiteファイルは、それを意図したパスで名前が付けられている可能性があります。

次のこと、このファイルのコルサタモデルを動的に作成する必要があります。これは一種のタフですが、可能です。これらのPLISTファイルをトラバースしたり、エンティティ、属性と関係を解釈したり、対応するNSEntityDescriptions、NSATTributedescriptions、およびNSRelationshipDesctiptionsを作成したり、NSManagedObjectModelを「手動」にしたりする必要があります。

を探したい
- [NSManagedObjectModel setEntities:(NSArray *)]
.

、NSentityDescription、NSATTributionScription、およびNSRelationshipDescriptionの作成方法。

このモデルをどこかに保存したいので、毎回再現する必要はありません。幸いなことに、それはNScodingに準拠しているので、それをディスクに保存できるようにする必要があります。

その後、あなたはおそらくあなたのデータを入力したいでしょう。ここから、MagicalRecordはあなたを助けることができます。私はデータのインポート投稿私は Cocoaです。私のガールフレンド

「ストアを切り替える」と推測する場合は、必要な各PLISTファイルの新しいストアを作成したい場合は、ファイルごとにコアデータスタック全体を引き下げる必要があります。 。このプロジェクトのMagicalRecordを使用することを管理した場合は、[MagicalRecord Cleanup]を見る必要があります。各モデルが同じであれば、永続ストアコーディネータをリリースして店に新しいものを作成することで取得できます。しかし、あなたの「スキーマ」はおそらく違うでしょう、あなたはただすべてを傷つけて始めたいです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top