首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >persistentStoreForURL始终返回nil

persistentStoreForURL始终返回nil
EN

Stack Overflow用户
提问于 2020-11-02 08:52:24
回答 1查看 27关注 0票数 0

我正在尝试将核心数据存储从XML迁移到SQLite。我创建了一个指向旧SQLite数据存储的URL (我验证了路径),然后创建了一个指向新XML数据存储的位置的URL。当我调用persistentStoreForURL (从持久存储协调器类),将URL传递给XML数据存储时,它返回nil。我不知道为什么会这样。我在谷歌上进行了多次搜索,发现一些人有同样的问题,但没有解决方案。

代码语言:javascript
复制
- (nullable NSPersistentStore *)migrateXMLStoreAtURL:(nonnull NSURL *)XMLStoreURL toSQLiteStoreAtURL:(nonnull NSURL *)SQLiteStoreURL
{
    NSParameterAssert(XMLStoreURL != nil);
    NSParameterAssert(SQLiteStoreURL != nil);


    NSError *error = nil;
    NSPersistentStore *XMLStore = [_persistentStoreCoordinator persistentStoreForURL:XMLStoreURL];
    NSPersistentStore *SQLiteStore = [_persistentStoreCoordinator migratePersistentStore:XMLStore toURL:SQLiteStoreURL
                                    options:nil withType:NSSQLiteStoreType error:&error];

    if (SQLiteStore == nil)
    {
        NSLog(@"Failed to migrate XML data store to SQLite data store.\n%@", [error description]);
    }

    return SQLiteStore;
}

XMLStore总是返回nil,即使URL确实指向一个已存在的文件。

有没有其他人遇到过这个问题?如果是,你找到原因了吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-11-06 16:32:52

下面是解决我的问题的代码。为了简洁起见,我从本例中的persistentStoreCoordinator方法中删除了一些代码。

代码语言:javascript
复制
- (nullable NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator)
    {
        return _persistentStoreCoordinator;
    }


    NSURL *newSQLiteDataStoreURL = [coreDataStoreDirectory URLByAppendingPathComponent:@"NewCoreDataStore.sqldata"];
    NSURL *oldXMLDataStoreURL = [coreDataStoreDirectory URLByAppendingPathComponent:@"OldCoreDataStore.storedata"];
    BOOL oldXMLDataStoreExists = [NSFileManager.defaultManager fileExistsAtPath:oldXMLDataStoreURL.path];

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSString *persistentStoreType = oldXMLDataStoreExists ? NSXMLStoreType : NSSQLiteStoreType;
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : @(YES)};
    NSURL *dataStoreURL = oldXMLDataStoreExists ? oldXMLDataStoreURL : SQLiteDataStoreURL;

    NSPersistentStore persistentStore = [coordinator addPersistentStoreWithType:persistentStoreType configuration:nil URL:dataStoreURL options:options error:&error];

    if (persistentStore == nil)
    {
        // Handle error.
    }


    // Check if the old XML data store is present. If so, migrate to a SQLite data store.

    if (oldXMLDataStoreExists)
    {
        // The old XML data store is present. Migrate to a SQLite data store.

        NSPersistentStore *migratedPersistentStore = [self migrateXMLPersistentStore:persistentStore toSQLiteStoreAtURL:SQLiteDataStoreURL];

        if (migratedPersistentStore == nil)
        {
            [self presentCoreDataError:error failureReason:failureReason];
        }
    }

    _persistentStoreCoordinator = coordinator;

    return coordinator;
}



- (nullable NSPersistentStore *)migrateXMLPersistentStore:(nonnull NSPersistentStore *)XMLStore toSQLiteStoreAtURL:(nonnull NSURL *)SQLiteStoreURL
{
    NSParameterAssert(XMLStore != nil);
    NSParameterAssert(SQLiteStoreURL != nil);


    NSError *error = nil;
    NSPersistentStore *SQLiteStore = [_persistentStoreCoordinator migratePersistentStore:XMLStore toURL:SQLiteStoreURL options:nil withType:NSSQLiteStoreType error:&error];

    if (SQLiteStore == nil)
    {
        NSLog(@"Failed to migrate XML data store to SQLite data store.\n%@", [error description]);
    }
    else
    {
        // Remove the old XML store.
    }

    return SQLiteStore;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64638505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档