仅用一行代码设置加密数据库!
EncryptedDATAStack 是基于 DATAStack 的分支,增加了对 Encrypted Core Data (Core Data + SQLCipher) 的支持,并增加了对iOS 8的额外支持。总而言之,这使得您只需一行代码即可设置数据库(加密或未加密)!
版本标签设置为匹配使用的DATAStack版本。
在能够运行示例之前,您必须使用CocoaPods安装示例依赖项。
pod install
您可以使用您的Core Data模型名称(xc-datamodel)轻松初始化新的EncryptedDATAStack实例。
Swift
let encryptedDataStack = EncryptedDATAStack(passphraseKey:"YOUR_PASSWORD", modelName:"MyAppModel")
Objective-C
EncryptedDATAStack *encryptedDataStack = [[EncryptedDATAStack alloc] initWithPassphraseKey:@"YOUR_PASSWORD" modelName:@"MyAppModel"];
还有许多其他初始化EncryptedDATAStack的方法。
//For Memory Storage
let encryptedDataStack = EncryptedDATAStack(modelName:"MyAppModel", storeType: .InMemory)
//For Regular SQLite
let encryptedDataStack = EncryptedDATAStack(modelName:"MyAppModel", storeType: .sqLiteNoEncryption)
let encryptedDataStack = EncryptedDATAStack(modelName: "Model", bundle: NSBundle(forClass: Tests.self), storeType: .InMemory)
CustomStoreName.sqlite
。let encryptedDataStack = EncryptedDATAStack(passphraseKey:"YOUR_PASSWORD", modelName: "Model", bundle: NSBundle.mainBundle(), storeType: .sqLite, storeName: "CustomStoreName")
let encryptedDataStack = EncryptedDATAStack(passphraseKey:"YOUR_PASSWORD", modelName: "Model", bundle: NSBundle.mainBundle(), storeType: .sqLite, storeName: "CustomStoreName", containerURL: sharedURL)
要访问主线程关联的NSManagedObjectContext,只需使用mainContext
属性即可。
self.encryptedDataStack.mainContext
或
self.encryptedDataStack.viewContext
您可以轻松创建一个新的NSManagedObjectContext用于数据处理。此代码块完全异步,将在后台线程上运行。
为了与NSPersistentContainer兼容,您也可以使用performBackgroundTask
而不是performInNewBackgroundContext
。
Swift
func createUser() {
self.encryptedDataStack.performInNewBackgroundContext { backgroundContext in
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: backgroundContext)!
let object = NSManagedObject(entity: entity, insertIntoManagedObjectContext: backgroundContext)
object.setValue("Background", forKey: "name")
object.setValue(NSDate(), forKey: "createdDate")
try! backgroundContext.save()
}
}
Objective-C
- (void)createUser {
[self.encryptedDataStack performInNewBackgroundContext:^(NSManagedObjectContext * _Nonnull backgroundContext) {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:backgroundContext];
NSManagedObject *object = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:backgroundContext];
[object setValue:@"Background" forKey:@"name"];
[object setValue:[NSDate date] forKey:@"createdDate"];
[backgroundContext save:nil];
}];
}
在使用Xcode的Objective-C自动完成功能时,backgroundContext
参数名称不会被包含。请确保添加它。
删除.sqlite
文件并重置您的EncryptedDATAStack状态,只需调用drop
即可。
Swift
self.encryptedDataStack.drop()
Objective-C
[self.encryptedDataStack forceDrop];
EncryptedDATAStack针对单元测试进行了优化,并在测试环境中同步运行。希望您现在需要使用更少的XCTestExpectations。
如果您的Core Data模型位于应用捆绑包中,您可以创建一个使用内存存储的堆栈,如下所示:
Swift
let encryptedDataStack = EncryptedDATAStack(modelName: "MyAppModel", bundle: NSBundle.mainBundle(), storeType: .InMemory)
Objective-C
EncryptedDATAStack *encryptedDataStack = [[EncryptedDATAStack alloc] initWithModelName:@"MyAppModel"
bundle:[NSBundle mainBundle]
storeType:EncryptedDATAStackStoreTypeInMemory];
如果您的Core Data模型位于测试捆绑包中:
Swift
let encryptedDataStack = EncryptedDATAStack(modelName: "MyAppModel", bundle: NSBundle(forClass: Tests.self), storeType: .InMemory)
Objective-C
EncryptedDATAStack *encryptedDataStack = [[EncryptedDATAStack alloc] initWithModelName:@"MyAppModel"
bundle:[NSBundle bundleForClass:[self class]]
storeType:EncryptedDATAStackStoreTypeInMemory];
如果EncryptedDATAStack
因为迁移处理不当或密码短语不正确而难以创建持久化协调器,它将销毁您数据并创建一个新的sqlite文件。正常情况下Core Data的这种行为是在启动时使您的应用程序崩溃。这可不是什么好玩的事情。
EncryptedDATAStack可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中:
use_frameworks!
pod 'EncryptedDATAStack', :git => 'https://github.com/flipacholas/EncryptedDATAStack.git'
您可以提交问题、Pull请求……我会很乐意帮忙。
Rodrigo Copetti,@flipacholas
特别感谢:
Elvis Nuñez,@3lvis和Project iMAS,project-imas
EncryptedDATAStack在Affero GPL v3许可证下提供。
……开玩笑的,对您来说,这是MIT许可证。有关更多信息,请参阅LICENSE文件。