2016-07-05 95 views
1

來自服務器的字符串的語言是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; 
} 
+0

您需要描述您的代碼在做什麼,因爲核心數據不需要任何特殊的步驟來將非英文字符存儲爲字符串。 –

+0

@TomHarrington服務器發送這個「\ U05de \ U05ea \ U05df \ U05d0 \ U05e6 \ U05f3 \ U05d0 \ U05d8」,並在標籤中顯示它正確地顯示它的權利,直到現在,但當我們保存在ios數據庫並從中獲取並顯示「????」 我嘗試編碼它之前保存到數據庫/解碼時提取...沒有運氣 – djay

+0

如果你不發表一些代碼,沒有答案是可能的。你做錯了什麼,但沒有一些代碼,沒有人可以真正告訴你什麼。 –

回答

1

而不是保存爲字符串保存爲NSData的。

下面的代碼可能會幫助您保存和檢索回來。

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 
+0

使用核心數據。你可以建議天氣有任何managedContext屬性來編碼,當我們保存數據。 – djay

+0

定義屬性時,將其設置爲二進制數據而不是字符串。並將您的特定字符串轉換爲數據並保存爲核心數據,就像您對普通屬性所做的一樣。 –

+0

是的,我實際上試圖將我的xcmod​​el displayName屬性的類型設置爲Binary,並將其相應的類屬性設置爲NSData,並在創建db對象時將nsstring轉換爲使用您的代碼以及UTF8編碼。兩者在這種情況下都不起作用。 – djay

2

這很難說究竟在何處事情會出錯(我們可以去圓,並通過討論輪意見很長一段時間),但答案是這樣的:

  1. 核心數據不需要任何特殊的步驟來存儲非英文文本。它只是工作。然而...
  2. 字符串編碼是容易搞砸,並且是一個非常常見的錯誤來源。在你的代碼的某處(也許在多個地方),你會得到錯誤的編碼,這會導致僞造字符串。它只是看起來像一個核心數據問題,因爲你正在使用這個編碼非常糟糕的字符串與核心數據。

作爲一個實驗,我創建了一個新的Xcode項目,使用「主數據 - 應用程序」模板,使用核心數據。然後,我將一個字段添加到名爲「name」的默認「Event」實體,並修改UI以顯示此字符串。

然後我指定的字符串爲「名」的值:

newEvent.name = @"מתןאצ׳אט";

創建一些情況下,退出並重新應用程序後,我可以驗證字符串被正確保存,檢索完整,並顯示在正確的UI:

iOS Simulator screenshot

所以,不要看你的核心數據的代碼,並開始尋找在你如何處理這個字符串的每一步。

+0

Got you!我確信你現在就是這樣!我懷疑我們有兩個用戶細節從服務器獲取調用,第一個是發送正確的編碼,但只要我們在這兩件事之間執行一些任務(從CoreData中檢索)(獲取數據並反映它),第二個服務器正在搞亂編碼,它在db中保存一個假的!非常感謝您的回答! – djay