0

次のリンクで説明されていることを実現するために、2 つのアプリケーション (iphone とデスクトップ) を作成しようとしています。

コアデータは、デスクトップアプリを構築して、データモデルを作成することが可能です

Ok。そこで、name という文字列属性フィールドを持つ Client という名前のエンティティを 1 つ持つ、非常に単純なデスクトップ アプリを作成しました。対応する Model クラスも生成しました。

アプリを実行して、いくつかのクライアント名をリストに追加し、ファイルを (Testing.sqlite として) 保存しました。

今、同等のiPhoneアプリでファイルをロードしようとしています。最初にアプリケーション テンプレートの 1 つを使用してアプリを生成し、Core Data を含めました。注意: Client エンティティをミラーリングし、対応する Model クラスを生成しました。

「アプリケーションデリゲート」クラスに入り、「Testing.sqlite」ファイルを参照するようにpersistentStoreCoordinatorメソッドを修正しました。

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Testing.sqlite"]];

また、保存したデスクトップ アプリ ファイルを予想される場所にコピーしました。

~/Library/Application Support/IPhone Simulator/User/... etc.

したがって、理論的には、少なくとも 2 つのアプリはそれぞれ同じである必要があります。

ただし、からデータをロードしようとすると、常に空のように見えます。私のコードは次のようになります。

    // fetch the delegate.
TestingAppDelegate *app = (TestingAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = [app managedObjectContext];

// construct the request.
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// execute the request.
NSError *error;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];

if (results == nil) { 
    // Handle the error.        
    NSLog(@"No data loaded");
} 

NSLog(@"Returned: %@", results);    

// finally release  
[results release]; 
[request release]; 

何が問題なのか理解できないようです。ヒントや提案は大歓迎です。

デバッグ中に、persistanceStoreCoordinator、managedObjectContext、結果の配列 (NSArray) のインスタンスを見ると、これらすべてのレコードが含まれていないように見えることがわかります。だから私は混乱しています。

注意: Testing.sqlite ファイルにはエントリが含まれています。

前もってありがとう、マット

4

1 に答える 1

0

Core Data を使用している場合、単純に sqlite データベース ファイルをコピーするだけでは機能しません。デスクトップ アプリケーションで作成した永続ストアを完全に複製する必要があります。

ただし、これは、コピーしたにもかかわらず Core Data がデータベース ファイルを認識していないという事実に関連する問題である可能性があります。次のことを試してください。

1) リソース グループ内のプロジェクトにデータベース ファイルを追加します 2) この方法を使用して、実際にデータベース ファイルを適切な場所にコピーします

- (NSString *) initialize_db {
    NSString *DATABASE_RESOURCE_NAME = @"testing";
    NSString *DATABASE_RESOURCE_TYPE = @"sqlite";
    NSString *DATABASE_FILE_NAME = @"testing.sqlite";

    // copy the database from the bundle if necessary
    // look to see if DB is in known location (~/Documents/$DATABASE_FILE_NAME)


    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentFolderPath = [searchPaths objectAtIndex: 0];
        NSString *dbFilePath = [documentFolderPath stringByAppendingPathComponent: DATABASE_FILE_NAME];
        [dbFilePath retain];

        if (! [[NSFileManager defaultManager] fileExistsAtPath: dbFilePath]) {
            // didn't find db, need to copy
            NSString *backupDbPath = [[NSBundle mainBundle]
                                      pathForResource:DATABASE_RESOURCE_NAME
                                      ofType:DATABASE_RESOURCE_TYPE];
            if (backupDbPath == nil) {
                // couldn't find backup db to copy, bail
                NSLog (@"couldn't init db");
                return NULL;
            } else {
                BOOL copiedBackupDb = [[NSFileManager defaultManager]
                                       copyItemAtPath:backupDbPath
                                       toPath:dbFilePath
                                       error:nil];
                if (! copiedBackupDb) {
                    // copying backup db failed, bail
                    NSLog (@"couldn't init db");
                    return NULL;
                }
            }
        }


        return dbFilePath;

    }

データベース ファイルをコピーすると、そのファイル パスが返され、それを使用して実際にデータベースを開きます。

于 2009-09-08T06:20:34.390 に答える