An amazing project that generates micro reports from tournament results
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
5.9 KiB

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2014 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////
#import "AppDelegate.h"
#import <Realm/Realm.h>
#import "DataModels.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = [[UIViewController alloc] init];
[self.window makeKeyAndVisible];
// copy over old data files for migration
NSURL *defaultRealmURL = [RLMRealmConfiguration defaultConfiguration].fileURL;
NSURL *defaultRealmParentURL = [defaultRealmURL URLByDeletingLastPathComponent];
NSURL *v0URL = [[NSBundle mainBundle] URLForResource:@"default-v0" withExtension:@"realm"];
[[NSFileManager defaultManager] removeItemAtURL:defaultRealmURL error:nil];
[[NSFileManager defaultManager] copyItemAtURL:v0URL toURL:defaultRealmURL error:nil];
// trying to open an outdated realm file without first registering a new schema version and migration block
// with throw
@try {
[RLMRealm defaultRealm];
}
@catch (NSException *exception) {
NSLog(@"Trying to open an outdated realm a migration block threw an exception.");
}
// define a migration block
// you can define this inline, but we will reuse this to migrate realm files from multiple versions
// to the most current version of our data model
RLMMigrationBlock migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
if (oldSchemaVersion < 1) {
[migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {
if (oldSchemaVersion < 1) {
// combine name fields into a single field
newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", oldObject[@"firstName"], oldObject[@"lastName"]];
}
}];
}
if (oldSchemaVersion < 2) {
[migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {
// give JP a dog
if ([newObject[@"fullName"] isEqualToString:@"JP McDonald"]) {
Pet *jpsDog = [[Pet alloc] initWithValue:@[@"Jimbo", @(AnimalTypeDog)]];
[newObject[@"pets"] addObject:jpsDog];
}
}];
}
if (oldSchemaVersion < 3) {
[migration enumerateObjects:Pet.className block:^(RLMObject *oldObject, RLMObject *newObject) {
// convert type string to type enum if we have outdated Pet object
if (oldObject && oldObject.objectSchema[@"type"].type == RLMPropertyTypeString) {
newObject[@"type"] = @([Pet animalTypeForString:oldObject[@"type"]]);
}
}];
}
NSLog(@"Migration complete.");
};
RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration];
// set the schema verion and migration block for the defualt realm
configuration.schemaVersion = 3;
configuration.migrationBlock = migrationBlock;
[RLMRealmConfiguration setDefaultConfiguration:configuration];
// now that we have set a schema version and migration block for the configuration,
// performing the migration and opening the Realm will succeed
[RLMRealm defaultRealm];
// print out all migrated objects in the default realm
NSLog(@"Migrated objects in the default Realm: %@", [[Person allObjects] description]);
//
// Migrate other Realm versions
//
NSURL *v1URL = [[NSBundle mainBundle] URLForResource:@"default-v1" withExtension:@"realm"];
NSURL *v2URL = [[NSBundle mainBundle] URLForResource:@"default-v2" withExtension:@"realm"];
NSURL *realmv1URL = [defaultRealmParentURL URLByAppendingPathComponent:@"default-v1.realm"];
NSURL *realmv2URL = [defaultRealmParentURL URLByAppendingPathComponent:@"default-v2.realm"];
[[NSFileManager defaultManager] removeItemAtURL:realmv1URL error:nil];
[[NSFileManager defaultManager] copyItemAtURL:v1URL toURL:realmv1URL error:nil];
[[NSFileManager defaultManager] removeItemAtURL:realmv2URL error:nil];
[[NSFileManager defaultManager] copyItemAtURL:v2URL toURL:realmv2URL error:nil];
// set schemave versions and migration blocks form Realms at each path
RLMRealmConfiguration *realmv1Configuration = [configuration copy];
realmv1Configuration.fileURL = realmv1URL;
RLMRealmConfiguration *realmv2Configuration = [configuration copy];
realmv2Configuration.fileURL = realmv2URL;
// manully migration v1Path, v2Path is migrated implicitly on access
[RLMRealm performMigrationForConfiguration:realmv1Configuration error:nil];
// print out all migrated objects in the migrated realms
RLMRealm *realmv1 = [RLMRealm realmWithConfiguration:realmv1Configuration error:nil];
NSLog(@"Migrated objects in the Realm migrated from v1: %@", [[Person allObjectsInRealm:realmv1] description]);
RLMRealm *realmv2 = [RLMRealm realmWithConfiguration:realmv2Configuration error:nil];
NSLog(@"Migrated objects in the Realm migrated from v2: %@", [[Person allObjectsInRealm:realmv2] description]);
return YES;
}
@end