| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich habe vor kurzem iCloud für CoreData in meine App integriert und soweit funktioniert auch alles tadellos. Hier einmal der für iCloud entsprechend geänderte Code meines NSPersistentStoreCoordinator:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator_ != nil)
{
return persistentStoreCoordinator_;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"<MyDatabase>.sqlite"];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

Settings *settings = [[Settings alloc] init];
NSString *iCloudEnabled = [NSString stringWithFormat:@"%@", [settings readValueForKey:@"ICloud"]];

if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0")) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSFileManager *fileManager = [NSFileManager defaultManager];

NSDictionary *options = nil;

NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"<MyIdentifier>"];
NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];

if ([coreDataCloudContent length] != 0) {

//iCloud is available
cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
@"<MyStore>.store", NSPersistentStoreUbiquitousContentNameKey,
cloudURL, NSPersistentStoreUbiquitousContentURLKey,
nil];
} else {

//iCloud is not available
options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
}

NSError *error = nil;
[persistentStoreCoordinator_ lock];

if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

if (![persistentStoreCoordinator_ migratePersistentStore:persistentStore toURL:storeURL options:options withType:NSSQLiteStoreType error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

NSLog(@"Persistent Stores Second: %i", [[persistentStoreCoordinator_ persistentStores] count]);

[persistentStoreCoordinator_ unlock];

dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"asynchronously added persistent store!");
[[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
});

});

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

NSError *error = nil;
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}

[settings release];

return persistentStoreCoordinator_;
}


Mit meinem aktuellen Code des NSPersistentStoreCoordinator ist die iCloud immer an.

Dem Nutzer stelle ich in den Einstellungen meiner App darüber hinaus aber einen Schalter zur Verfügung, in dem er iCloud aktivieren (Variable "iCloudEnabled" = YES) und auch wieder deaktivieren (Variable "iCloudEnabled" = NO) kann (standardmäßig ist dieser Schalter erst einmal deaktiviert).

Wie muss aber nun der Code aussehen, der ausgeführt wird wenn dieser Schalter eben aktiviert oder deaktiviert wird? Nach meinem Verständnis muss ich ja dann auch den NSPersistentStoreCoordinator wieder entsprechend anpassen, damit er entweder auf die iCloud zugreift oder die iCloud eben nicht mehr nutzt.

Besten Dank bereits im Voraus für jede Hilfe und viele Grüße,
Thomas
17.06.2012
Sillivan 479 7
Verstehe die Frage nicht ganz. Du hast sicherlich ein Settings-Bundle, dem du einfach das Flag iCloudEnabled hinzufügen kannst?
puls200 17.06.2012
Sorry falls ich mich etwas undeutlich ausgedrückt habe, ich habe meine Frage jetzt etwas angepasst, hoffe mein Problem wird damit klarer. Es geht im Endeffekt darum, dass ich in meinen App-Einstellung einen Schalter zum Ein- bzw. Ausschalten von iCloud integriert habe, aber nicht weiß, wie der Code aussehen muss, wenn der Nutzer iCloud entsprechend aktiviert oder deaktiviert. Ich muss ja dann jeweils auch wieder den NSPersistentStoreCoordinator anpassen, damit er entweder auf die iCloud zugreift oder nicht. Mit meinem aktuellen Code von oben nutzt er ja immer die iCloud (ab iOS 5).
Sillivan 17.06.2012
iCloudEnabled: müsste doch ein Boolean sein oder? warum verwendest du nicht NSUserDefaults?
Dann wäre es doch einfach:
if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") && iCloudEnabled) { ..
aber ich glaube immer noch du meinst etwas anderes.
puls200 17.06.2012