2013-11-14 18 views
6

में डेटाबेस को प्रीलोड करना अतीत में मैंने अपने ऐप को पहले से लोड किए गए डेटाबेस के साथ जारी किया है, इसलिए उपयोगकर्ता को इसे पहले रन पर अपडेट करने की आवश्यकता नहीं थी। वहाँ कुछ कोड मैं इतने पर एक और सवाल में पाया (क्षमा करें, अब और लिंक नहीं है) कि मैं अपने अनुप्रयोग प्रतिनिधि के persistentStoreCoordinator विधि को जोड़ा गया था:आईओएस 7

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db.sqlite"]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) 
    { 
     NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"]]; 
     NSError* err = nil; 

     if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) 
     { 
      NSLog (@"Error - Could not preload database."); 
     } 
    } 

//... more code generated from the template here 
} 

जब मैं आईओएस 7 में यह करने के लिए प्रयास करते हैं, मैं कोई त्रुटि न पाएं, लेकिन डेटाबेस खाली है (भले ही मेरे mainBundle में डेटाबेस की सभी जानकारी है जो मैं उम्मीद कर रहा हूं)। मैंने देखा कि applicationDocumentsDirectory में अधिक डेटाबेस फ़ाइलें (ए। एसक्लाइट-श्म फ़ाइल और एक। एसक्लाइट-वाल फ़ाइल) हैं। क्या मुझे उन फ़ाइलों के साथ कुछ करने की ज़रूरत है? या ऐप के साथ प्रीलोडेड डेटाबेस जहाज रखना अब संभव नहीं है?

संपादित करें: मैंने नई .sqlite-shm और .sqlite-wal फ़ाइलों को कॉपी करने के लिए कोड जोड़ने का प्रयास किया, लेकिन इससे मदद नहीं मिलती है।

उत्तर

5

कोर डाटा iOS 7 में थोड़ा बदल गया है को बचाती है मुख्य रूप से किस तरह का प्रदर्शन कर रहे हैं।

प्रदर्शन को बेहतर बनाने के लिए आगे लॉगिंग (वाल) पेश किया गया था, इसलिए WAL sqlite फ़ाइल जो आप देखते हैं।

आप पुराने 'पत्रिका मोड' का उपयोग करने के अपने अनुप्रयोग बता सकते हैं: विन्यास: यूआरएल: विकल्प:

आप जब addPersistentStoreWithType बुला NSSQLitePragmasOption विकल्पों को जोड़कर पत्रिका मोड निर्दिष्ट कर सकते हैं त्रुटि । जैसे को हटाने की पिछले डिफ़ॉल्ट मोड सेट:

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} }; 

Source

मुझे यकीन है कि अगर यह आपकी समस्या का समाधान होगा नहीं कर रहा हूँ, लेकिन यह बड़ी बात iOS 7 में कोर डेटा के साथ बदल गया है वह यह है कि

आप वाल बारे में अधिक जानकारी चाहते हैं, तो मैं देख सुझाव देते हैं WWDC session #207, "Whats New In Core Data & iCloud"

+0

हां, यही 'options' शब्दकोश काम कर देता है जोड़ने। मैं आपके द्वारा लिंक किए गए वीडियो की जांच करूंगा, और उम्मीद है कि यह कुछ ऐसा नहीं है जिसे मैं आवश्यकता होगी =)। अन्यथा मुझे लगता है कि मुझे एक और समाधान मिलना होगा, लेकिन ऐसा लगता है कि अब यह काम करता है। – GeneralMike

+0

डब्ल्यूएएल बहुप्रचारित अनुप्रयोगों में प्रदर्शन बढ़ाता है, इसलिए जर्नल मोड को बदलने के बारे में सावधान रहें। मुझे नहीं पता कि WAL सक्षम के साथ पूर्व-जनसंख्या वाले डेटाबेस को कैसे शिप किया जाए, हालांकि। –

+0

@ डेविड कैंट: मैं इस बिंदु पर अपने ऐप के प्रदर्शन के बारे में बहुत चिंतित नहीं हूं। मेरे ऐप के पिछले संस्करण में डाटाबेस ऑपरेशंस बहुत धीमी थीं, लेकिन मैंने बर्बाद जगह को खत्म करने के लिए अपनी कई टेबलों को काफी कम कर दिया और मेरे fetches को एक सत्र में जिस जानकारी की आवश्यकता होगी, उसे बेहतर तरीके से बदल दिया। उन संशोधनों के बाद, वस्तुतः कोई पता लगाने योग्य देरी नहीं है। अगर कुछ बदलाव और प्रदर्शन फिर से पीड़ित होता है, तो मैं फिर भी वाल में देखने के लिए ध्यान रखूंगा - धन्यवाद। – GeneralMike

5

मैं कॉपी किया .sqlite-shm और .sqlite-वाल के रूप में अच्छी तरह से है और यह w फ़ाइलें orked:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite"]; 

// Check if the sqlite store exists 
if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { 
    NSLog(@"File not found... copy from bundle"); 

    // copy the sqlite files to the store location. 
    NSString *bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 

    bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite-wal"]; 
    storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite-wal"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 

    bundleStore = [[NSBundle mainBundle] pathForResource:@"emm_samples" ofType:@"sqlite-shm"]; 
    storePath = [documentsDirectory stringByAppendingPathComponent: @"emm_samples.sqlite-shm"]; 
    [[NSFileManager defaultManager] copyItemAtPath:bundleStore toPath:storePath error:nil]; 
} 
else { 
    NSLog(@"File exists"); 
} 

(के आधार पर: Core Data Store included in App Bundle)