Core Data; Cocoa error 134100

前端 未结 6 1517
北荒
北荒 2020-12-14 08:17

This is my first time with core data, and I am getting the following error.

I would really appreciate it if you could tell me how to fix it.

Unresolv         


        
相关标签:
6条回答
  • 2020-12-14 08:43

    It happens with me as well and by removing STORE URL I fixed my this with bellow code - [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

    Clarification : delete the file at the storeURL and recreate it, if we don’t want data to stick around between tests. Since the new tests have a new model version and the old file couldn’t be opened properly. Also if we changed managed object model - we have to write migrations for it.

    0 讨论(0)
  • 2020-12-14 08:50

    It should be enough if you remove the app from your simulator/device.

    You don't have to change the files in your project (except choosing a current model and replacing the classes using menu: Editor/Create NSManaged Object Subclass).

    0 讨论(0)
  • 2020-12-14 08:57

    If you are in developing mode and don't want to delete the app each time you change the entities I recommend to use this solution:

    - (void)removeCoreDataStorage {
        // Where does the SQLite file go?
        NSArray *documentDirectories =
        NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                            NSUserDomainMask,
                                            YES);
        // Get one and only document directory from that list
        NSString *documentDirectory = [documentDirectories firstObject];
        NSString *path = [documentDirectory stringByAppendingPathComponent:@"model.sqlite"];
    
        NSError *error = nil;
        NSURL *storeURL = [NSURL fileURLWithPath:path];
    
        NSURL *storeURLWal = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-wal"]];
        NSURL *storeURLShm = [NSURL URLWithString:[storeURL.absoluteString stringByReplacingOccurrencesOfString:@".sqlite" withString:@".sqlite-shm"]];
    
        BOOL isRemoveItemAtURL = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];
        if (isRemoveItemAtURL == NO) {
            NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
        }
    
        BOOL isRemoveItemAtURLWal = [[NSFileManager defaultManager] removeItemAtURL:storeURLWal error:&error];
        if (isRemoveItemAtURLWal == NO) {
            NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
        }
    
        BOOL isRemoveItemAtURLShm = [[NSFileManager defaultManager] removeItemAtURL:storeURLShm error:&error];
        if (isRemoveItemAtURLShm == NO) {
            NSLog(@"NO RemoveItemAtURL. Reason: %@", error.localizedFailureReason);
        }
    }
    

    Don't forget to change the path with your own path.

    0 讨论(0)
  • 2020-12-14 09:01

    Here's the reason:

    The model used to open the store is incompatible with the one used to create the store

    And here's how you did it:

    1. You created some entities with some attributes and wrote some code
    2. Launched the app, probably added some content
    3. Quit the app and added/changed some more entities with attributes
    4. You probably launched the app again and now it's giving you the error

    The reason for this is because your new managed object model is trying to use older version of storage (the one first time created when you launched the app).

    The quick and dirty fix would be to remove the storage file (somewhere in ~/Library/Application Support/YOUR_APP/) and to launch your app again.

    For future reference - if you release an app and in next release the app has changed managed object model - you have to write migrations for it. All this and more is covered in core data programming cookbook in apple documentation.

    0 讨论(0)
  • 2020-12-14 09:01

    Sometimes you need to load data from a store created by another application - e.g. one app is used just for loading data from external source and for saving into the store and the othe app uses this store full of data as a starting point.

    I don`t want to say it is super-correct but in case you need it from time to time during the app development: just change the UUID in the store (by SQLVue etc.) to the right one which is expected by your app. You will find the UUID in the table called in most cases ZMETADATA in the only one column called Z_UUID. But remember - just for quick debugging / development purposes. Do not use this programmatically.

    0 讨论(0)
  • 2020-12-14 09:09

    You should do following steps

    1. Delete the application and Run it again, if it still shows the same error. Then it means that, you used the specific attributes/attribute with different type.
    2. Go to your .xcdatamodeled file and check the type of each attributes.
    3. Go to your code and check, while inserting the attributes/objects in core data, you used the same type of different. So, the point is type(NSString, NSDate...) of the attributes/objects in your code and .xcdatamodeled should be same. If not then it will give the error "Error Domain=NSCocoaErrorDomain Code=134100"
    0 讨论(0)
提交回复
热议问题