2013-08-16 30 views
17

Tôi đang làm việc trên một dự án iOS đề cập đến việc di chuyển bằng các phiên bản khác nhau của coredata của tôi.Mã lỗi sqlite persistentstorecoordinator: 522 'không phải là lỗi'

Tôi cũng đã thử xung quanh câu lệnh if trong khi bắt và trả về mã lỗi sqlite 522.

Có gì sai ở đây không?

mã sau đây của tôi:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{ 
    if (__persistentStoreCoordinator != nil) { 
    return __persistentStoreCoordinator; 
    } 
    NSURL *storeURL = [[self applicationDocumentsDirectory]  
    URLByAppendingPathComponent:@"coredatadb.sqlite"]; 
    NSError *error = nil; 
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){ 

     [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; 
     [__persistentStoreCoordinator release]; 
     __persistentStoreCoordinator = nil; 
     return [self persistentStoreCoordinator]; 
    } 

    return __persistentStoreCoordinator; 

Trả lời

3

Vì vậy, nó trông giống như giải quyết vấn đề cụ thể của tôi sau đây, mặc dù một số người sẽ tham mưu chống lại thay đổi chế độ ghi nhật ký trên cơ sở dữ liệu SQLite của bạn:

// Change journal mode from WAL to MEMORY 
NSDictionary *pragmaOptions = [NSDictionary dictionaryWithObject:@"MEMORY" forKey:@"journal_mode"]; 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
pragmaOptions, NSSQLitePragmasOption, nil]; 
+0

Thnaks cho thông tin bạn nhập. Thêm vào điểm Kevinl, chúng ta có thể sử dụng "DELETE" thay vì "MEMORY" https://www.sqlite.org/pragma.html#pragma_journal_mode – Boobalan

38

Bằng cách thay đổi chế độ ghi nhật ký bạn chỉ tránh được vấn đề nhưng bạn không sửa nó. Chế độ ghi nhật ký mới cung cấp cho ứng dụng của bạn một số lợi ích như tốc độ.

Vấn đề thực sự là bạn chỉ xóa 1 tệp thay vì cả 3 tệp được sử dụng trong chế độ đó. Không chỉ coredatadb.sqlite của bạn mà còn là tệp coredatadb.sqlite-shm và và coredatadb.sqlite-wal. Một cái gì đó về lược đồ và viết-trước hoặc như vậy, hãy kiểm tra các video WWDC 2013 trên dữ liệu cốt lõi để biết chi tiết.

Để khắc phục vấn đề của bạn, bạn nên xóa tất cả các file trong thư mục Documents mà bắt đầu bằng "coredatadb.sqlite" và mọi thứ đều miễn phí và dễ dàng một lần nữa ;-)

Cập nhật dành cho iOS 9: Nó là dễ dàng hơn và an toàn hơn bây giờ sử dụng destroyPersistentStoreAtURL hoặc replacePersistentStoreAtURL. Xem WWDC 2015 phiên 220_hd_whats_new_in_core_data.

+0

Đây là câu trả lời đúng. Sử dụng câu trả lời SO khác để xóa tệp phù hợp với mẫu cụ thể: http://stackoverflow.com/questions/6179667/remove-files-matching-a-pattern-in-ios –

Các vấn đề liên quan