想試試CoreMl的同學(xué)可以看看CoreMlDemo
如果你用夠了FMDB或者CoreData,不妨試試realm
最新更新,特別感謝@deepindo
/// 查詢排序后所有數(shù)據(jù),關(guān)鍵詞及是否升序
static func selectScoretByAll<T: Object>(_: T.Type ,key: String, isAscending: Bool) -> Results<T>{
return sharedInstance.objects(T.self).sorted(byProperty: key, ascending: isAscending)
}
import UIKit
import RealmSwift
class ZYWRealm: NSObject {
/// realm 數(shù)據(jù)庫(kù)的名稱
static let username = "MY-DB"
static let sharedInstance = try! Realm()
//--MARK: 初始化 Realm
/// 初始化進(jìn)過加密的 Realm森爽, 加密過的 Realm 只會(huì)帶來(lái)很少的額外資源占用(通常最多只會(huì)比平常慢10%)
static func initEncryptionRealm() {
// 說(shuō)明: 以下內(nèi)容是可以合并操作的恋拍,但為了能最大限度的展示各個(gè)操作內(nèi)容衔统,故分開設(shè)置 Realm
// 產(chǎn)生隨機(jī)密鑰
var key = Data(count: 64)
_ = key.withUnsafeMutableBytes {mutableBytes in
SecRandomCopyBytes(kSecRandomDefault, key.count, mutableBytes)
}
// 獲取加密 Realm 文件的配置文件
var config = Realm.Configuration(encryptionKey: key)
// 使用默認(rèn)的目錄行楞,但是使用用戶名來(lái)替換默認(rèn)的文件名
config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm")
// 獲取我們的 Realm 文件的父級(jí)目錄
let folderPath = config.fileURL!.deletingLastPathComponent().path
/**
* 設(shè)置可以在后臺(tái)應(yīng)用刷新中使用 Realm
* 注意:以下的操作其實(shí)是關(guān)閉了 Realm 文件的 NSFileProtection 屬性加密功能攒暇,將文件保護(hù)屬性降級(jí)為一個(gè)不太嚴(yán)格的、允許即使在設(shè)備鎖定時(shí)都可以訪問文件的屬性
*/
// 解除這個(gè)目錄的保護(hù)
try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none], ofItemAtPath: folderPath)
// 將這個(gè)配置應(yīng)用到默認(rèn)的 Realm 數(shù)據(jù)庫(kù)當(dāng)中
Realm.Configuration.defaultConfiguration = config
}
/// 初始化默認(rèn)的 Realm
static func initRealm() {
var config = Realm.Configuration()
// 使用默認(rèn)的目錄子房,但是使用用戶名來(lái)替換默認(rèn)的文件名
config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm")
// 獲取我們的 Realm 文件的父級(jí)目錄
let folderPath = config.fileURL!.deletingLastPathComponent().path
// 解除這個(gè)目錄的保護(hù)
try! FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.none],
ofItemAtPath: folderPath)
// 將這個(gè)配置應(yīng)用到默認(rèn)的 Realm 數(shù)據(jù)庫(kù)當(dāng)中
Realm.Configuration.defaultConfiguration = config
}
//--- MARK: 操作 Realm
/// 做寫入操作
static func doWriteHandler(_ clouse: @escaping ()->()) { // 這里用到了 Trailing 閉包
try! sharedInstance.write {
clouse()
}
}
///后臺(tái)做寫入操作
static func BGDoWriteHandler(_ clouse: @escaping ()->()) {
try! Realm().write {
clouse()
}
}
/// 添加一條數(shù)據(jù)
static func addCanUpdate<T: Object>(_ object: T) {
try! sharedInstance.write {
sharedInstance.add(object, update: true)
}
}
static func add<T: Object>(_ object: T) {
try! sharedInstance.write {
sharedInstance.add(object)
}
}
/// 后臺(tái)單獨(dú)進(jìn)程寫入一組數(shù)據(jù)
static func addListDataAsync<T: Object>(_ objects: [T]) {
let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default)
// Import many items in a background thread
queue.async {
// 為什么添加下面的關(guān)鍵字形用,參見 Realm 文件刪除的的注釋
autoreleasepool {
// 在這個(gè)線程中獲取 Realm 和表實(shí)例
let realm = try! Realm()
// 批量寫入操作
realm.beginWrite()
// add 方法支持 update ,item 的對(duì)象必須有主鍵
for item in objects {
realm.add(item, update: true)
}
// 提交寫入事務(wù)以確保數(shù)據(jù)在其他線程可用
try! realm.commitWrite()
}
}
}
static func addListData<T: Object>(_ objects: [T]) {
autoreleasepool {
// 在這個(gè)線程中獲取 Realm 和表實(shí)例
let realm = try! Realm()
// 批量寫入操作
realm.beginWrite()
// add 方法支持 update 证杭,item 的對(duì)象必須有主鍵
for item in objects {
realm.add(item, update: true)
}
// 提交寫入事務(wù)以確保數(shù)據(jù)在其他線程可用
try! realm.commitWrite()
}
}
/// 刪除某個(gè)數(shù)據(jù)
static func delete<T: Object>(_ object: T) {
try! sharedInstance.write {
sharedInstance.delete(object)
}
}
/// 批量刪除數(shù)據(jù)
static func delete<T: Object>(_ objects: [T]) {
try! sharedInstance.write {
sharedInstance.delete(objects)
}
}
/// 批量刪除數(shù)據(jù)
static func delete<T: Object>(_ objects: List<T>) {
try! sharedInstance.write {
sharedInstance.delete(objects)
}
}
/// 批量刪除數(shù)據(jù)
static func delete<T: Object>(_ objects: Results<T>) {
try! sharedInstance.write {
sharedInstance.delete(objects)
}
}
/// 批量刪除數(shù)據(jù)
static func delete<T: Object>(_ objects: LinkingObjects<T>) {
try! sharedInstance.write {
sharedInstance.delete(objects)
}
}
/// 刪除所有數(shù)據(jù)田度。注意,Realm 文件的大小不會(huì)被改變解愤,因?yàn)樗鼤?huì)保留空間以供日后快速存儲(chǔ)數(shù)據(jù)
static func deleteAll() {
try! sharedInstance.write {
sharedInstance.deleteAll()
}
}
/// 根據(jù)條件查詢數(shù)據(jù)
static func selectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{
return sharedInstance.objects(T.self).filter(predicate)
}
/// 后臺(tái)根據(jù)條件查詢數(shù)據(jù)
static func BGselectByNSPredicate<T: Object>(_: T.Type , predicate: NSPredicate) -> Results<T>{
return try! Realm().objects(T.self).filter(predicate)
}
/// 查詢所有數(shù)據(jù)
static func selectByAll<T: Object>(_: T.Type) -> Results<T>{
return sharedInstance.objects(T.self)
}
//--- MARK: 刪除 Realm
/*
參考官方文檔镇饺,所有 fileURL 指向想要?jiǎng)h除的 Realm 文件的 Realm 實(shí)例,都必須要在刪除操作執(zhí)行前被釋放掉送讲。
故在操作 Realm實(shí)例的時(shí)候需要加上 autoleasepool 奸笤。如下:
autoreleasepool {
//所有 Realm 的使用操作
}
*/
/// Realm 文件刪除操作
static func deleteRealmFile() {
let realmURL = Realm.Configuration.defaultConfiguration.fileURL!
let realmURLs = [
realmURL,
realmURL.appendingPathExtension("lock"),
realmURL.appendingPathExtension("log_a"),
realmURL.appendingPathExtension("log_b"),
realmURL.appendingPathExtension("note")
]
let manager = FileManager.default
for URL in realmURLs {
do {
try manager.removeItem(at: URL)
} catch {
// 處理錯(cuò)誤
}
}
}
}