2011-04-12 24 views
7

मैं एप्पल डॉक्स में इनमें से कोई एक स्पष्ट विवरण नहीं मिल सकता है ...कोर डाटा स्टोर ऐप्स में शामिल बंडल

  1. मैं अपने xcode परियोजना
  2. लांच समय, मेरे एप्लिकेशन में एक xcdatamodeld है एक एक्सएमएल (परियोजना संसाधन) कोर डाटा स्टोर (SQLLite)
  3. को भरने के लिए पार्स करता है मेरी ऐप्लिकेशन के जीवनकाल के दौरान, मैं जोड़ने, हटाने, कि स्टोर का अद्यतन डेटा

अब, मुझे लगता है कि भारी कर बंद करना चाहते हैं डिवाइस और प्रत्यक्ष पर एक्सएमएल पार्सिंग प्रक्रिया ly में आवश्यक डेटा युक्त एक स्टोर शामिल है।

  • मैं एक ओएस एक्स अनुप्रयोग के साथ एक दुकान को भरने और फिर मेरी XCode आईओएस परियोजना में इस स्टोर में शामिल कर सकते हैं:

    मैं इस बारे में कुछ सवाल हैं?

  • मेरा स्टोर एक्सकोड में प्रकट नहीं होता है। वास्तव में यह रन टाइम पर बनाया गया है। मैं प्रोजेक्ट में एक स्टोर कैसे जोड़ सकता हूं और इसे अपने xcdatamodeld से लिंक कर सकता हूं?
  • मैंने पढ़ा है कि ऐसा करने से मेरे स्टोर को लिखने से रोका जा सकता है ... मुझे लगता है कि मुझे इसे लॉन्च टाइम पर सही जगह पर कॉपी करना होगा (कोर डेटा यूटिलिटी ट्यूटोरियल उस के लिए एक बड़ी मदद है)। क्या मैं सही हू ?

आपके संकेतों के लिए धन्यवाद। यूआरएल या अन्य एसओ सवाल वास्तव में सराहना करेंगे!

Kheraud

उत्तर

14

आप दुकान फ़ाइल आपके एप्लिकेशन में (ज्यादातर समय db SQLite) शामिल कर सकते हैं। फिर अपने एप्लिकेशन प्रतिनिधि संपादन में persistentStoreCoordinator गेटर merhod:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

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

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDataStore.sqlite"]; 

    // Check if the store exists in. 
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
     // copy the payload to the store location. 
     NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"YourPayload" ofType:@"sqlite"]; 

     NSError *error = nil; 
     [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:&error]; 

     if (error){ 
      NSLog(@"Error copying payload: %@", error); 
     } 
    } 

    NSError *error = nil; 
    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 
+0

कोड के टुकड़े के लिए धन्यवाद। क्या आपको नहीं लगता कि डिवाइस/कोर डेटा/कॉपी डीबी के बीच संगतता समस्या हो सकती है? – iwalktheline

+0

नहीं, मैं ज्यादातर सिम्युलेटर के साथ डीबी बना देता हूं और फिर डिवाइस पर इसका उपयोग करता हूं, कोई समस्या नहीं है। – rckoenes

+0

आपके उत्तर की दूसरी वाक्य में, ** persantstore ** क्या है? (टाइपो?) – David

6

क्या आप वर्तमान में (पहले लॉन्च में पॉप्युलेट) कर रहे हैं "सुझाए गए" एक कोर डाटा दुकान को आबाद करने का तरीका है। हालांकि इसकी एक सा hackish, आप फिर भी डिवाइस पर मौजूद डेटाबेस बीज सकता है इस प्रकार है:

  1. सिम्युलेटर
  2. क्या जो कुछ भी आप कोर डाटा दुकान को भरने के लिए सिम्युलेटर अनुप्रयोग के लिए क्या करने की जरूरत में अपने एप्लिकेशन लॉन्च
  3. ( ~/Library/Application Support/iPhone Simulator/4.3/Applications/335567A0-760D-48AF-BC05-7F0D9BD085B6/<app-name>.app/ की तरह कुछ)
  4. नकली दस्तावेज़ फ़ोल्डर को सिम्युलेटर एप्लिकेशन
  5. नेविगेट बंद करो
  6. SQLite डेटाबेस (यह है नाम आप इसे जब कोर डाटा आरंभ दिया)
  7. सह इस प्रोजेक्ट को अपने प्रोजेक्ट में पाइये, और इसे संसाधन
  8. के रूप में कॉपी करने के लिए जोड़ें, अपने application:didFinishLaunchingWithOptions: विधि में कुछ कोड जोड़ें ताकि पहले लॉन्च पर, यह केवल पढ़ने-योग्य संसाधन निर्देशिका से डेटाबेस को ऐप की दस्तावेज़ निर्देशिका में कॉपी करता है। निश्चित रूप से आपको को कोर डेटा प्रारंभ करने से पहले करने की आवश्यकता है।

आप अपने डेटाबेस में जो भी स्टोर कर रहे हैं उसके आधार पर, आप बड़े-छोटे-छोटे-छोटे मुद्दों, या अन्य असंगतताओं को खोज सकते हैं।दृष्टिकोण को थोड़ा सुरक्षित बनाने के लिए, आप अपने मैक पर सिम्युलेटर डेटाबेस (splite3 databasefile .dump >dumpfile) डंप कर सकते हैं, फिर अपनी प्रोजेक्ट में डंपफाइल (ऊपर के रूप में) शामिल कर सकते हैं, और अपने ऐप में पहले लॉन्च पर डंप को स्लिप कर सकते हैं (इसे लाइन-बाय- लाइन, और sql स्टेटमेंट को एसक्यूएल स्टेटमेंट सौंपना)।

+0

ठीक है। ऐसा लगता है कि एसक्यूएल डंप और पार्स + भरना एक अच्छा तरीका है। लेकिन एक्सएमएल से निपटना इतना जटिल नहीं है (मुझे लगता है)। इसके अलावा, मुझे नेटवर्क के माध्यम से एक्सएमएल डेटा प्राप्त होता है और मुझे इसे पार्स करने की आवश्यकता होती है। मैं अपने एक्सएमएल मैकेनिक को इस तरह रखूंगा ... मदद के लिए धन्यवाद, मैं इसे बाद में उपयोग कर सकता हूं :) – iwalktheline

10
  1. ऐप के लिए डेटा मॉडल और कक्षाओं का उपयोग करके एक उपयोगिता ऐप लिखें। XML द्वारा प्रदान किए गए डेटा से लगातार स्टोर उत्पन्न करने के लिए उपयोगिता ऐप का उपयोग करें।
  2. स्टोर फ़ाइल को ऐप बंडल में किसी भी अन्य संसाधन
  3. ऐप निर्देशिका में एक स्थान चुनें जहां आप सक्रिय स्टोर को रहने के लिए चाहते हैं उदा। लाइब्रेरी निर्देशिका।
  4. लॉन्च होने पर ऐप जांचता है कि स्टोर निर्देशिका में मौजूद है या नहीं। यदि ऐसा नहीं है, तो ऐप को किसी अन्य फ़ाइल की तरह मानक NSFileManger विधियों का उपयोग करके ऐप बंडल से स्टोर में प्रतिलिपि बनाना चाहिए। (आमतौर पर, आपको केवल स्टोर की पहली बार इसे करने की आवश्यकता होती है।)

यह सब वास्तव में इसके लिए है।

+2

क्या यह ठीक है अगर मैं बंडल में स्क्लाइट फ़ाइल रखता हूं, क्योंकि यह केवल पढ़ने के लिए है ?? – onmyway133

+0

कोर डेटा ऐप की एप्लिकेशन समर्थन निर्देशिका में स्क्लाइट फ़ाइल (ओं) को ढूंढना चाहेगा: 'FileManager.default.url (के लिए: .plplicationSupportDirectory, \t \t \t में: .userDomainMask, उपयुक्त के लिए: nil, create: false) ' इसे पाने का एक तरीका है। यह ठीक है, हालांकि, यदि आप डेटाबेस को प्रीलोड कर रहे हैं तो एप्लिकेशन समर्थन पर प्रतिलिपि बनाने के लिए बंडल में फ़ाइल (ओं) की एक प्रतिलिपि रखने के लिए। - ओह, यह निश्चित रूप से स्विफ्ट है, क्योंकि यह कुछ साल बाद है ;-) – leanne

संबंधित मुद्दे