我正在尝试将核心数据存储从XML迁移到SQLite。我创建了一个指向旧SQLite数据存储的URL (我验证了路径),然后创建了一个指向新XML数据存储的位置的URL。当我调用persistentStoreForURL (从持久存储协调器类),将URL传递给XML数据存储时,它返回nil。我不知道为什么会这样。我在谷歌上进行了多次搜索,发现一些人有同样的问题,但没有解决方案。
- (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确实指向一个已存在的文件。
有没有其他人遇到过这个问题?如果是,你找到原因了吗?
谢谢!
发布于 2020-11-06 16:32:52
下面是解决我的问题的代码。为了简洁起见,我从本例中的persistentStoreCoordinator方法中删除了一些代码。
- (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;
}https://stackoverflow.com/questions/64638505
复制相似问题