2013-02-12 18 views
6

जब मैं अपना आईओएस ऐप अपडेट करता हूं, तो मैं Documents निर्देशिका में मौजूदा sqlite डेटाबेस को हटाना चाहता हूं। अभी, एक एप्लिकेशन अपडेट पर, मैं डेटाबेस को बंडल से दस्तावेज़ निर्देशिका में कॉपी करता हूं और बंडल संस्करण को जोड़कर इसे नाम देता हूं। तो, अद्यतन पर, मैं भी मौजूद किसी पुराने संस्करण को हटाना चाहता हूं।आईओएस: दस्तावेज़ों से विशिष्ट एक्सटेंशन के साथ सभी मौजूदा फाइलों को कैसे हटाएं?

मैं बस सभी sqlite फ़ाइलों को हटाने के लिए सक्षम होना चाहता हूं, बिना लूप के और पिछले संस्करणों के लोगों को ढूंढने के बिना। क्या removeFileAtPath: विधि वाइल्डकार्ड का कोई तरीका है?

+3

संक्षिप्त उत्तर: नहीं। आप लूप क्यों नहीं चाहते हैं? मजा आता है। – trojanfoe

+1

मैचों की सरणी प्राप्त करने के लिए आपको NSFileManager का उपयोग करने की आवश्यकता है। [यहां नमूना कोड] [1]। [1]: http://stackoverflow.com/a/4764532/1445366 –

+0

क्या NSFileManager कल्पना कहता है? –

उत्तर

13

तो, आप सभी *.sqlite फ़ाइलों को हटाना चाहते हैं? लूपिंग से बचने का कोई तरीका नहीं है, लेकिन आप पहले गैर-एसक्यूएल फाइलों को फ़िल्टर करने के लिए NSPredicate का उपयोग कर इसे सीमित कर सकते हैं और तेज गणना का उपयोग करके तेज़ प्रदर्शन सुनिश्चित कर सकते हैं। इसे करने का एक तरीका यहां दिया गया है:

- (void)removeAllSQLiteFiles  
{ 
    NSFileManager *manager = [NSFileManager defaultManager]; 

    // the preferred way to get the apps documents directory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    // grab all the files in the documents dir 
    NSArray *allFiles = [manager contentsOfDirectoryAtPath:documentsDirectory error:nil]; 

    // filter the array for only sqlite files 
    NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.sqlite'"]; 
    NSArray *sqliteFiles = [allFiles filteredArrayUsingPredicate:fltr]; 

    // use fast enumeration to iterate the array and delete the files 
    for (NSString *sqliteFile in sqliteFiles) 
    { 
     NSError *error = nil; 
     [manager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:sqliteFile] error:&error]; 
     NSAssert(!error, @"Assertion: SQLite file deletion shall never throw an error."); 
    } 
} 
+0

धन्यवाद - कोड काम करता प्रतीत होता है लेकिन जब मैं ऑर्गनाइज़र में ऐप की जांच करता हूं तो फ़ाइल वास्तव में कभी नहीं हटाई जाती है। क्या यह सिर्फ विकास मोड में चलने की 'विशेषता' है? – Michaela

+0

@Michaela यह कोड में एक बग था। मैंने 'RemoveItemAtPath' को हटाने का पूरा मार्ग नहीं दिया है, इसलिए फाइलें नहीं मिलीं और हटा दी गईं। अब तय – memmons

+0

मैं 'nSError * error = nil;' त्रुटि: 'त्रुटि:' त्रुटि के बजाय 'त्रुटि: nil'' निकालने के लिए 'हटाएं ItemAtPath:' तो आप किसी भी समस्या को डीबग करने में मदद करने के लिए मौजूद होने पर त्रुटि लॉग कर सकते हैं। – Robert

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