【问题标题】:How to save non-english language/special characters in core data?如何在核心数据中保存非英语语言/特殊字符?
【发布时间】:2016-11-07 06:55:43
【问题描述】:

来自服务器的字符串语言是 Herbew,当我直接向我的视图显示该数据时,字符会正确显示,但下次我尝试从数据库中获取它时“? ???”来代替正确的字符!

//这是我将带有显示名称的联系人保存到 DB//

    -(BOOL)addContact:(ALContact *)userContact {

        ALDBHandler * dbHandler = [ALDBHandler sharedInstance];

        DB_CONTACT* existingContact = [self getContactByKey:@"userId" value:[userContact userId]];
        if (existingContact) {
            return NO;
        }

        BOOL result = NO;

        DB_CONTACT * contact = [NSEntityDescription insertNewObjectForEntityForName:@"DB_CONTACT" inManagedObjectContext:dbHandler.managedObjectContext];
        contact.displayName = userContact.displayName;

        NSError *error = nil;
        result = [dbHandler.managedObjectContext save:&error];

        if (!result) {
            NSLog(@"addContact DB ERROR :%@",error);
        }

        return result;
}

【问题讨论】:

  • 您需要描述您的代码在做什么,因为 Core Data 不需要任何特殊步骤来将非英文字符存储为字符串。
  • @TomHarrington 服务器发送此“\U05de\U05ea\U05df \U05d0\U05e6\U05f3\U05d0\U05d8”,并在标签中正确显示此 מתן א צ׳אט‎‎到目前为止,但是当我们保存在 ios 数据库中并从中获取时,它显示“????”我在获取时尝试对其进行编码,然后保存到数据库 / 解码中......没有运气
  • 如果您不发布一些代码,则无法回答。你做错了什么,但没有一些代码没有人能真正告诉你什么。
  • @TomHarrington 我完全理解,但流程正在经历许多课程!它不是一个可以做到这一切的单一方法!我仍然会尝试使用流添加代码位!谢谢!
  • 好的,那么userContact 是什么?它如何获得displayName 的值?这似乎是一个关键细节。

标签: ios core-data character-encoding utf


【解决方案1】:

很难准确判断哪里出了问题(我们可以通过在 cmets 中讨论很长时间来兜兜转转),但答案会是这样的:

  1. Core Data 不需要任何特殊步骤来存储非英文文本。它只是工作。不过……
  2. 字符串编码非常很容易搞砸,并且是极其常见的错误来源。在您的代码中的某个地方(可能在多个地方)您的编码错误,这会导致虚假字符串。它只是看起来像一个 Core Data 问题,因为您在 Core Data 中使用了这个编码错误的字符串。

作为一个实验,我使用“Master-Detail Application”模板,使用 Core Data 创建了一个新的 Xcode 项目。然后我在默认的“事件”实体中添加了一个名为“名称”的字段,并修改了 UI 以显示该字符串。

然后我将您的字符串分配为“名称”的值:

在创建几个实例、退出并重新启动应用程序后,我可以验证字符串是否正确保存、完整检索并正确显示在 UI 中:

所以,停止查看您的 Core Data 代码并开始查看处理此字符串的每一步。

【讨论】:

  • 知道了!我确定你现在就是!我怀疑我们有两个从服务器获取调用的用户详细信息,第一个是正确编码的,但是一旦我们在这两件事(获取数据并反映它)之间执行一些任务(从 CoreData 检索),第二个服务器就搞砸了编码在数据库中保存虚假的一个!非常感谢您的回答!!
【解决方案2】:

保存为 NSdata,而不是保存为 String。

以下代码可能会帮助您保存和检索它。

var herbrewStrFromServer = "⌘" //Herbew String
let dataSaveCoreData = NSKeyedArchiver.archivedDataWithRootObject(herbrewStrFromServer) //Converting into Nsdata so as to save in coredata
let actualStringRetreived = NSKeyedUnarchiver.unarchiveObjectWithData(dataSaveCoreData) as! String // retrieving it back from core data

【讨论】:

  • 使用核心数据。你能建议我们保存数据时有任何 managedContext 属性来编码吗?
  • 定义属性时,将其作为二进制数据而不是字符串。并像处理普通属性一样将您的特定字符串转换为数据并保存到核心数据中。
  • 是的,我实际上尝试将我的 xcmod​​el displayName 属性的类型设置为 Binary 并将其相应的类属性设置为 NSData 并在创建 db 对象时,我将 nsstring 转换为使用您的代码以及 UTF8 编码以及。在这种情况下两者都不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2015-05-16
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多