2013-02-12 22 views
6

Khi tôi cập nhật ứng dụng iOS của mình, tôi muốn xóa bất kỳ cơ sở dữ liệu sqlite hiện có nào trong thư mục Documents. Ngay bây giờ, khi cập nhật ứng dụng, tôi sao chép cơ sở dữ liệu từ gói vào thư mục tài liệu và đặt tên nó bằng cách thêm phiên bản gói. Vì vậy, khi cập nhật, tôi cũng muốn xóa mọi phiên bản cũ có thể tồn tại.iOS: Làm thế nào để xóa tất cả các tập tin hiện có với phần mở rộng cụ thể từ thư mục tài liệu?

Tôi chỉ muốn xóa tất cả các tệp sqlite mà không phải lặp lại và tìm kiếm các tệp từ phiên bản trước. Có cách nào để ký tự đại diện cho phương thức removeFileAtPath: không?

+3

Câu trả lời ngắn gọn: Không. Tại sao bạn không muốn lặp lại? Điêu đo rât vui. – trojanfoe

+1

Bạn cần sử dụng NSFileManager để nhận một mảng các kết quả phù hợp. [Mã mẫu tại đây] [1]. [1]: http://stackoverflow.com/a/4764532/1445366 –

+0

Thông số NSFileManager nói gì? –

Trả lời

13

Vì vậy, bạn muốn xóa tất cả *.sqlite tệp? Không có cách nào để tránh lặp, nhưng bạn có thể giới hạn nó bằng cách sử dụng NSPredicate để lọc ra các tệp không phải sql đầu tiên và đảm bảo hiệu suất nhanh bằng cách sử dụng liệt kê nhanh. Đây là một phương pháp để làm điều đó:

- (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

Cảm ơn - Mã có vẻ hoạt động nhưng tệp không bao giờ thực sự bị xóa khi tôi kiểm tra ứng dụng trong Trình tổ chức. Đây có phải chỉ là một 'tính năng' chạy trong chế độ phát triển không? – Michaela

+0

@Michaela Đó là một lỗi trong mã. Tôi đã không cung cấp đường dẫn đầy đủ đến 'removeItemAtPath' để các tệp không được tìm thấy và bị xóa. Đã sửa lỗi. – memmons

+0

Tôi sẽ đề nghị sử dụng 'NSError * error = nil;' 'lỗi: & error' thay vì' error: nil' cho 'removeItemAtPath:' sau đó bạn có thể đăng nhập lỗi nếu nó tồn tại để giúp bạn gỡ lỗi bất kỳ vấn đề nào. – Robert