0

以前、コア データを使用するアプリがあります。同じストア URL を使用して NSManagedObjectModel を初期化し、NSPersistentStoreCoordinator を作成します。しかし、新しいアプリで、同じように使ってみたところ、モデルが作成できません。したがって、NSManagedObjectModel を作成するには、モデル URL (このフォーラムで見つけました) を使用する必要があります。どうした?

これはOLDアプリからのものです:

- (NSString *)storeName
{
    return @"ABC.storedata";
}

- (NSURL *)storeUrl
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
    return storeURL;
}

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel == nil) {
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self storeUrl]];
    }
    return _managedObjectModel;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {

       abort();
    }    

    return _persistentStoreCoordinator;
}

これは新しいアプリからです:

- (NSString *)storeName
{
    return @"DEF.sqlite";
}

- (NSURL *)storeUrl
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
    return storeURL;
}

- (NSURL *)modelUrl
{
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DEF" withExtension:@"momd"];
    return modelURL;
}

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel == nil) {
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self modelUrl]];
    }
    return _managedObjectModel;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {

       abort();
    }    

    return _persistentStoreCoordinator;
}
4

1 に答える 1

1

モデルストアと永続ストアの両方に同じURLを使用することはできません。これは、これらが2つの非常に異なるものであるためです。

モデルURLは、.momdファイルパッケージであるXcodeプロジェクトに含まれる実際のモデルリソースを指している必要があります。永続ストアは、あなたの場合、データベース、ドキュメントディレクトリ内の.sqliteファイルです。

過去にどのように機能したか想像できません。1つの可能性は、ABC.storedataに末尾の.sqliteがなかったため、Core Dataがバックグラウンドで.sqliteを追加し、DEF.storedataがモデル名と何らかの形で一致した可能性があることです。

これは、「Model」をモデルリソースのXcodeプロジェクトで使用している名前に置き換えるモデルを初期化する適切な方法です。

NSURL *modelURL             = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];        
model                       = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

永続ストアに関しては、制限はありません。ただし、ほとんどの場合、アプリケーションドキュメントディレクトリにあるはずです。

于 2012-06-26T06:16:39.550 に答える