Skip to content

Instantly share code, notes, and snippets.

@satococoa
Created November 21, 2012 01:45
Show Gist options
  • Save satococoa/4122543 to your computer and use it in GitHub Desktop.
Save satococoa/4122543 to your computer and use it in GitHub Desktop.
RubyMotion でシンプルな CoreData のマイグレーションを行うコード
module MigrateOneToTwo
module_function
def store_path
File.join(App.documents_path, 'store.sqlite')
end
def tmp_store_path
File.join(App.documents_path, 'store_tmp.sqlite')
end
def migrate_needed?
return false unless FileTest.exist?(store_path)
error_ptr = Pointer.new(:object)
meta = NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:NSURL.fileURLWithPath(store_path), error:error_ptr)
error = error_ptr[0]
if error
log_error error
return false
end
ver = meta["NSStoreModelVersionIdentifiers"][0]
ver == '' || ver == 'ver1'
end
def migrate!
migrate_store(
NSURL.fileURLWithPath(store_path),
NSURL.fileURLWithPath(tmp_store_path)
)
end
def migrate_store(store_url, dst_store_url)
source_model = model('DataModel.mom')
dst_model = model('DataModel 2.mom')
error_ptr = Pointer.new(:object)
mapping_model = NSMappingModel.inferredMappingModelForSourceModel(source_model, destinationModel:dst_model, error:error_ptr)
error = error_ptr[0]
log_error error unless error.nil?
return false if mapping_model.nil?
manager = NSMigrationManager.alloc.initWithSourceModel(source_model, destinationModel:dst_model)
result = manager.migrateStoreFromURL(store_url, type:NSSQLiteStoreType, options:nil, withMappingModel:mapping_model, toDestinationURL:dst_store_url, destinationType:NSSQLiteStoreType, destinationOptions:nil, error:error_ptr)
error = error_ptr[0]
log_error error unless error.nil?
if result
# リネームして上書き
error_ptr = Pointer.new(:object)
manager = NSFileManager.defaultManager
manager.removeItemAtPath(store_path, error:error_ptr)
error = error_ptr[0]
unless error.nil?
log_error error
return false
end
manager.moveItemAtPath(tmp_store_path, toPath:store_path, error:error_ptr)
error = error_ptr[0]
unless error.nil?
log_error error
return false
end
end
return result
end
def model(model_name)
url = NSURL.fileURLWithPath(
File.join(App.resources_path, 'DataModel.momd', model_name))
NSManagedObjectModel.alloc.initWithContentsOfURL(url)
end
end
@satococoa
Copy link
Author

NSStoreModelVersionIdentifiers は ver1, ver2, ver3...みたいに入力することにしたが、既に配布済みのver1にはそれを入れていないため、migrate_needed?の最後の行のようになっている。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment