菜鸟教程小白 发表于 2022-12-11 19:04:27

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


                                            <p><p>我正在尝试使用 Objective-C中的轻量级迁移将 NSNumber 迁移到 NSString 属性。版本 0 <a href="/image/VtCpu.png" rel="noreferrer noopener nofollow"><img src="/image/VtCpu.png" alt="enter image description here"/></a> </p>

<p>第 2 版</p>

<p> <a href="/image/8L0Lj.png" rel="noreferrer noopener nofollow"><img src="/image/8L0Lj.png" alt="enter image description here"/></a> </p>

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

<p> <a href="/image/mAmh9.png" rel="noreferrer noopener nofollow"><img src="/image/mAmh9.png" alt="enter image description here"/></a> </p>

<p>由于它不会在轻量级迁移中得到解决,我尝试使用 CoreDataMapping 模型和 NSEntity 迁移策略,如下所示。
<a href="/image/HghKj.png" rel="noreferrer noopener nofollow"><img src="/image/HghKj.png" alt="enter image description here"/></a> </p>

<p>创建了 NSEntityMigrationPolicy 的子类并尝试了以下代码</p>

<pre><code>@interface SampleMigrationV1toV2 : NSEntityMigrationPolicy

@end

#import &#34;SampleMigrationV1toV2.h&#34;

@implementation SampleMigrationV1toV2

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
    NSManagedObject *newObject = inManagedObjectContext:];

    // 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:
    forKey:@&#34;number&#34;];

    ;
    return YES;
}
@end
</code></pre>

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

<pre><code>- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

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

    NSString *storePath = [ stringByAppendingPathComponent:@&#34;CoreDataMigrationPolicty.sqlite&#34;];

    NSURL *storeUrl = ;

    NSMutableDictionary *options = [ init];
    forKey:NSMigratePersistentStoresAutomaticallyOption];
    forKey:NSInferMappingModelAutomaticallyOption];

    NSError *error = nil;
    persistentStoreCoordinator = [ initWithManagedObjectModel:];
    if (!)
    {
      //NSLog(@&#34;Unresolved error %@, %@&#34;, error, );
      abort();
    }

    return persistentStoreCoordinator;
}
</code></pre>

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

<p>未创建/调用映射模型。更改核心数据中的属性数据类型是否正确?有没有其他方法可以在不崩溃/重新安装应用程序的情况下解决此问题。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>最后我发现我从这个答案中所做的错误。
<a href="https://stackoverflow.com/questions/5366587/core-data-migration-attribute-mapping-value-expression" rel="noreferrer noopener nofollow">Core Data Migration: Attribute Mapping Value Expression</a> </p>

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

<pre><code>#import &#34;SampleMigrationV1toV2.h&#34;

@implementation SampleMigrationV1toV2

-(NSString *)convertNumberToString:(NSNumber *)number{
    return;
}
@end
</code></pre>

<p> <a href="/image/HzPRm.png" rel="noreferrer noopener nofollow"><img src="/image/HzPRm.png" alt="Mention Custom policy name(i.e.SampleMigrationV1toV2) on clicking Entity Mapping SampleToSample in"/></a> </p>

<p> <a href="/image/ibaaS.png" rel="noreferrer noopener nofollow"><img src="/image/ibaaS.png" alt="Enter the expression &#34;FUNCTION($entityPolicy, &#34;convertNumberToString:&#34; , $source.number)&#34; on clicking the attribute you want to migrate"/></a> </p>

<p>FUNCTION($entityPolicy, "convertNumberToString:", $source.number) :</p>

<p>$entityPolicy 获取我们在EntityMapping“SampleToSample”中提到的对应的MappingPolicy(即SampleMigrationV1toV2)和函数“convertNumberToString:”通过取输入值$source.Number将数字迁移到字符串</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46892791/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46892791/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration