簡體   English   中英

是否存在捕獲核心數據屬性檢索以用空字符串替代nil字符串的好地方?

[英]Is there a good place to capture Core Data attribute retrieval to override nil string with empty strings instead?

我正在使用Core Data和一個稍微復雜的數據模型。 在許多情況下,字符串屬性將被取消設置,並且在這些情況下,Core Data在檢索屬性時顯然返回nil 我想大體上重寫此行為,以便如果數據模型的任何字符串屬性都將返回nil,則它將返回一個空字符串。

在核心數據之上,我同時使用了生成器和Magical Record。 數據模型中的所有實體都直接或間接繼承自AbstractEntity,因此我希望我可以編輯生成器的人工文件以某種方式捕獲行中的調用,而不管它們是使用KVC還是方法調用,並返回如果string屬性為nil,則為空字符串。 在類似的情況下,如果整數屬性為零,我想返回一個空字符串。

這可能嗎? 還是我必須分別覆蓋每個屬性?

聽起來您真正想要的是將字符串屬性的默認值設置為空字符串。 在大多數情況下,您可以在Core Data模型編輯器中為屬性設置默認值。 每當您創建新的托管對象時,都會將該值自動分配給該屬性。 但是編輯器不支持使用空字符串作為默認字符串,因此您不能在那里使用它。

不過,您可以在運行時將默認值設置為空字符串。 數據模型是可編輯的,直到您開始使用它們為止。 因此,創建模型對象后,一個不錯的選擇是立即進行操作。 下面將為數據模型中的每個字符串屬性分配一個空字符串作為默認值:

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
    _managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];

    NSEntityDescription *entityDescription = [_managedObjectModel entitiesByName][@"Entity"];
    for (NSString *attributeName in [entityDescription attributesByName]) {
        NSAttributeDescription *attributeDesc = [entityDescription attributesByName][attributeName];
        if ([attributeDesc attributeType] == NSStringAttributeType) {
            [attributeDesc setDefaultValue:@""];
        }
    }

    return _managedObjectModel;
}

使用此名稱或類似名稱,創建新實例時,模型中的每個字符串屬性將自動為空字符串。 如果不想對每個字符串屬性都執行此操作,請編輯代碼以對實體和/或屬性名稱添加一些額外的檢查。

湯姆的解決方案是我使用的解決方案,但方式略有不同。 由於我對大多數Core Data訪問使用Magical Record,因此我的應用程序委托沒有managedObjectModel屬性。 但是,通過在CVCAbstractEntity生成的CVCAbstractEntity類中放置與他類似的代碼,在-awakeFromInsert方法中,可以很好地解決該問題。

在某種程度上,它比Tom的解決方案略遜一籌,因為盡管默認值確實應該是空字符串,但是在創建托管對象時,這會將字符串屬性設置為空字符串。 但是除非我想更改Magical Record類別的代碼,否則此解決方案對我來說效果更好。

這是我添加到-awakeFromInsert的代碼。

NSManagedObjectModel *mom = [NSManagedObjectModel defaultManagedObjectModel];
NSEntityDescription *entityDesc = [[mom entitiesByName] objectForKey:[self entityName]];
for (NSString *attributeName in [entityDesc attributesByName]) {
  NSAttributeDescription *attrDesc = [[entityDesc attributesByName] objectForKey:attributeName];
  if ([attrDesc attributeType] == NSStringAttributeType) {
    [self setValue:@"" forKey:attributeName];
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM