2010-08-11 18 views
9

क्या शब्दकोशों को सहेजने के लिए कोई आकार सीमा है?NSDictionary writeToFile

मैं लिखने के लिए नेस्टेड शब्दकोशों के साथ लगभग 100 कुंजी के साथ एक बड़ा शब्दकोश लिखने का प्रयास कर रहा हूं: लेकिन यह कभी नहीं लिखता है और हमेशा झूठा होता है।

इस एक सीमा है या मैं कुछ गलत,

कोड मैं का उपयोग निम्नलिखित है कर रहा हूँ।

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 
NSString *fullPath = [documentsDir stringByAppendingPathComponent:@"test.plist"]; 

[myDict writeToFile: fullPath atomically:YES]; 
+0

क्या आप सुनिश्चित हैं कि आपके पास शब्दकोश पेड़ में एम्बेडेड कोई भी गैर-कोड योग्य वस्तुएं न हों। एनएससीओडी के अनुरूप वस्तुओं का एक सीमित सेट है। कंसोल में एक चेक लें, मुझे लगता है कि अगर यह मामला है तो यह अपमानजनक ऑब्जेक्ट विवरण को बाधित करता है। –

उत्तर

12

कोई आकार सीमा नहीं है (स्मृति और डिस्क स्थान के लिए सहेजें)।

myDict की सामग्री क्या हैं?

यदि यह संपत्ति सूचियों में अनुमत कक्षाओं के छोटे समूह के अलावा कुछ भी है, तो आप writeToFile:atomically: का उपयोग नहीं कर सकते हैं।

या तो आपको केवल अपनी कक्षाओं को या के उदाहरणों को सीमित करने की आवश्यकता होगी, आपको एक अलग संग्रह विधि का उपयोग करने की आवश्यकता होगी।

विशेष रूप से, जेएसओएन पुस्तकालयों में से कई संग्रहों में NSNULL उदाहरणों को फेंक देंगे। उनको संग्रहीत नहीं किया जा सकता है। आपको या तो उन्हें संपादित करने या उन वस्तुओं के साथ प्रतिस्थापित करने की आवश्यकता है जिन्हें संग्रहीत किया जा सकता है।

प्रासंगिकता के

:

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Archiving/Archiving.html#//apple_ref/doc/uid/10000047i

+5

मुझे एक ही समस्या थी और समस्या [NSNull null] शब्द शब्दकोश में थी :) – yasirmturk

+0

@yasirmturk - ऐसा हुआ! धन्यवाद। – Myxtic

27

, इस के लिए एक और चाल नहीं है केवल पात्र वस्तुओं का उपयोग कर के अलावा (NSNumber, NSString, NSData आदि के उदाहरण) कुंजी NSString होना जरूरी वस्तुओं। आम तौर पर आप NSDictionary कुंजी के लिए किसी ऑब्जेक्ट का उपयोग कर सकते हैं लेकिन सफल लिखने के लिए टोफाइल: NSDictionary में कुंजियों को एनएसएसटींगिंग के उदाहरणों की आवश्यकता होती है।

+7

मुझे लिखने के लिए एनएस डिक्शनरी को सहेजने में परेशानी हो रही थी, इस जवाब ने मुझे जिस समस्या का सामना करना पड़ा, उसे हल करने में मदद की। इस तरह के quirks समस्या निवारण के लिए समय की इतनी मूर्खतापूर्ण बर्बादी हो सकती है। – ozz

+0

यह पुष्टि करना चाहता था कि यह वास्तव में मेरी समस्या का समाधान करेगा! मैं NSNumber (ओं) को कुंजी के रूप में उपयोग कर रहा था लेकिन संख्याओं को परिवर्तित करने के बाद संख्याओं को परिवर्तित करने के बाद शब्दकोश नहीं लिखा जाएगा! धन्यवाद, @ ओटुकन! – Motasim

4

मैं एक और चाल जोड़ूंगा साथ ही मैं शेर पर भी भाग गया। एनएस डिक्शनरी writeToFile:atomically: पर कॉल करने से पहले जिस फ़ोल्डर को आप प्लिस्ट लिखना चाहते हैं, वह मौजूद होना चाहिए। आप अस्तित्व का परीक्षण करने के लिए NSFileManager का उपयोग कर सकते हैं और यदि आवश्यक हो तो एक नया फ़ोल्डर बना सकते हैं।

0

मेरे पास यह था, जैसा कि दूसरों द्वारा वर्णित है, शब्दकोश कुछ डेटा प्रकारों (उल्लेखनीय एनयूएलएल) के साथ सहेजा नहीं जा सकता है।

क्योंकि मेरा शब्दकोश सर्वर (जेएसओएन के रूप में) से था, इसलिए मैं गारंटी नहीं दे सका कि इसमें क्या था इसलिए मैंने जेएसओएन के क्रमिकरण से पहले रॉ डेटा (डेटाविथकंट्सऑफ्लू से) बचाया। इस अंत में मैं अनुमान लगा रहा हूं कि आप एनएसडीटा को कन्वर्ट कर सकते हैं और उसे बचा सकते हैं - कुछ ऐसा;

NSData *convetedData = [NSKeyedArchiver archivedDataWithRootObject:JSONDict]; 

और फिर बाद में पुनर्प्राप्त करें और इस तरह वापस परिवर्तित करें।

NSDictionary *JSONDict = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:convertedDATA];