• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:04:27 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试使用 Objective-C 中的轻量级迁移将 NSNumber 迁移到 NSString 属性。版本 0 enter image description here

第 2 版

enter image description here

我已将核心数据模型当前版本更改为 2

enter image description here

由于它不会在轻量级迁移中得到解决,我尝试使用 CoreDataMapping 模型和 NSEntity 迁移策略,如下所示。 enter image description here

创建了 NSEntityMigrationPolicy 的子类并尝试了以下代码

@interface SampleMigrationV1toV2 : NSEntityMigrationPolicy

@end

#import "SampleMigrationV1toV2.h"

@implementation SampleMigrationV1toV2

- (BOOL)createDestinationInstancesForSourceInstanceNSManagedObject *)sInstance entityMappingNSEntityMapping *)mapping managerNSMigrationManager *)manager errorNSError **)error
{
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];

    // Copy all the values from sInstance into newObject, making sure to apply the conversion for the string to int when appropriate. So you should have one of these for each attribute:
    [newObject setValue:[sInstance valueForKey"number"] forKey"number"];

    [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];
    return YES;
}
@end

在持久协调器中,我已将 NSInferMappingModelAutomaticallyOption 更改为 NO,如下所示,

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent"CoreDataMigrationPolicty.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSMutableDictionary *options = [[NSMutableDictionary alloc] init];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:NO] forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl optionsptions error:&error])
    {
        //NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return persistentStoreCoordinator;
}

做完所有这些事情后,我收到了类似“Error Domain=NSCocoaErrorDomain Code=134110”(null)"UserInfo={NSUnderlyingException=Couldn't create mapping policy for class named (CoreDataMigrationPolicty.SampleMigrationV1toV2)} with userInfo 字典之类的错误

未创建/调用映射模型。更改核心数据中的属性数据类型是否正确?有没有其他方法可以在不崩溃/重新安装应用程序的情况下解决此问题。



Best Answer-推荐答案


最后我发现我从这个答案中所做的错误。 Core Data Migration: Attribute Mapping Value Expression

问题在于我在映射模型属性中提到的表达式。 语法是 FUNCTION($entityPolicy, "convertNumberToString:", $source.number) 函数定义是这样的

#import "SampleMigrationV1toV2.h"

@implementation SampleMigrationV1toV2

-(NSString *)convertNumberToStringNSNumber *)number{
    return  [number stringValue];
}
@end

Mention Custom policy name(i.e.SampleMigrationV1toV2) on clicking Entity Mapping SampleToSample in

Enter the expression "FUNCTION($entityPolicy, "convertNumberToString:" , $source.number)" on clicking the attribute you want to migrate

FUNCTION($entityPolicy, "convertNumberToString:", $source.number) :

$entityPolicy 获取我们在EntityMapping“SampleToSample”中提到的对应的MappingPolicy(即SampleMigrationV1toV2)和函数“convertNumberToString:”通过取输入值$source.Number将数字迁移到字符串

关于ios - 在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46892791/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap