Created
November 21, 2012 01:45
-
-
Save satococoa/4122543 to your computer and use it in GitHub Desktop.
RubyMotion でシンプルな CoreData のマイグレーションを行うコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
NSStoreModelVersionIdentifiers は ver1, ver2, ver3...みたいに入力することにしたが、既に配布済みのver1にはそれを入れていないため、
migrate_needed?
の最後の行のようになっている。