2011-02-17 4 views
5

मैं एक्सकोड 4 में एक एसक्लाइट डेटाबेस जोड़ना चाहता हूं (एक्सकोड 3 पर भी लागू होता है)। ट्यूटोरियल संसाधन फ़ोल्डर में .db फ़ाइल जोड़ते हैं, और मुझे लगता है कि इसे ~/लाइब्रेरी/एप्लिकेशन सपोर्ट/आईफोन सिम्युलेटर/4.2/एप्लिकेशन/{कुछ-आईडी}/दस्तावेज़/ पर कॉपी किया जा सकता है, जहां आप इसे पा सकते हैं NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) आदिमैं एक्सकोड में संसाधन फ़ोल्डर में फ़ाइलों को कैसे जोड़ूं?

हालांकि, XCode 4 में एक दृश्य संसाधन फ़ोल्डर नहीं है।

मैंने फ़ाइल जोड़ें ... कमांड के साथ एक फ़ाइल जोड़ने का प्रयास किया है, और फिर यह लक्ष्य> ऐपनाम> कॉपी बंडल संसाधनों में दिखाई देता है, लेकिन उपर्युक्त दस्तावेज़ फ़ोल्डर में हमेशा एक खाली .db फ़ाइल प्रकट होती है (जिसे मैं तब करता हूं मैन्युअल की जगह - स्पष्ट रूप से नहीं सही दृष्टिकोण)

(डेटा मैं CoreData से अधिक SQLite) के साथ चिपके हुए कर रहा हूँ की प्रकृति के कारण

उत्तर

11

आप अपने प्रोजेक्ट-xcode में अपने डाटाबेस जोड़ने शुरू कर दिया है, तो यह आपके बंडल फ़ोल्डर में जोड़ा जाएगा, जहां आप इसे कोड के माध्यम से पा सकते हैं:

[NSBundle mainBundle] 

यह एकमात्र फ़ोल्डर है जहां आप एक्सकोड के माध्यम से फाइलें जोड़ सकते हैं जब आप अपने ऐप को "बिल्ड" करते हैं (अंततः उपफोल्डर्स के साथ, लेकिन "सिस्टम" फ़ोल्डरों को "दस्तावेज़" के रूप में नहीं) अब आपको यह ध्यान रखना होगा कि मुख्य बंडल फ़ोल्डर बस है "केवल पढ़ने", ताकि आप लिखने के विशेषाधिकारों के साथ अपने डीबी का उपयोग नहीं कर सकें। तो सामान्य तरीका यह है:

1) जब आप अपने डीबी का उपयोग करना चाहते हैं, तो ऐप में मौजूद होने पर कोड के माध्यम से जांचें: दस्तावेज़ फ़ोल्डर। बेशक पहली बार ऐसा नहीं होता है के , तो

2) मुख्य बंडल

- (BOOL)transferDb { 
    NSError **error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourData.db"]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if (![fileManager fileExistsAtPath: path]) 
    { 
     NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"preferenze" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:path error:error]; 
     return YES; 
    } 
    return NO; 
} 

3) यह (आर/डब्ल्यू) का उपयोग से इसे कॉपी में दस्तावेज़ फ़ोल्डर

पुनश्च: और (ज़ाहिर है) ध्यान रखें कि जब आप आईफोन/सिम्युलेटर में डीबी का उपयोग/संपादन/लिखते हैं, तो शायद रिकॉर्ड जोड़ना, मुख्य बंडल में से एक और निश्चित रूप से आपके मैक/प्रोजेक्ट में से एक अपडेट नहीं किया जाएगा, इसमें कोई रिकॉर्ड नहीं जोड़ा जाएगा, इसलिए अगर किसी भी कारण से आप आईफोन/सिम्युलेटर (या "एक्सकोड" बिल्ड "मेनू द्वारा" सभी लक्ष्यों को साफ करें) पर अपना ऐप हटा दें तो चेक/कॉपी विधि दस्तावेज़ फ़ोल्डर में "कुंवारी" डीबी की प्रतिलिपि बनाएँ, ताकि आप अपने सभी परिवर्तनों को खो देंगे ...

+1

मैं सिर्फ कि क्या यह कोड SQLite फ़ाइलों का स्थान के रूप में आईओएस 8 और Yosemite के लिए मान्य अभी भी है के रूप में पूछताछ करने के लिए चाहते हैं बदल गया है –

2

दस्तावेज़ फ़ोल्डर में डाले गए डेटा की मात्रा से सावधान रहें, यह उपयोगकर्ता डेटा के लिए है और इसके बाद से iCloud ऐप्पल का उपयोग करके डेटा का बैक अप लिया जाएगा ऐप्पल ने एक ऐप स्टोर और डेटा फ़ोल्डर में उपयोग किए जा सकने वाले डेटा की मात्रा सीमित कर दी है।

इस ऐप को 6 एमबी SQLite डेटाबेस का उपयोग करने के लिए अस्वीकार कर दिया गया था। इसके बजाय इसे कैश निर्देशिका में कॉपी करें: NSCachesDirectory।

या बैकअप लिया जा रहा से फाइल को रोकने: https://developer.apple.com/library/ios/#qa/qa1719/_index.html