
swift 之本地数据库CoreData
http://www.jianshu.com/p/8eaddcac1fd5
_CoreData无法找到对应实体类问题:
http://www.th7.cn/Program/IOS/201411/314502.shtml
swift支持多线程 *** 作数据库类库-CoreDataManager:
http://www.swiftmi.com/topic/35.html
canDB.swift框架
https://github.com/colatusso/canDB.swift
canDB.swift 是基于sqlite(FMDB)的iOS数据库框架,作用类似 nonsql 的数据库。通过FMDB使用sqlite,Just put the Json into the can and retrIEve it as a dictionary(只需把Json放置在can中,即可检索数据字典)。用法非常简单。
let dataArray:Array = (try! NSJsONSerialization.JsONObjectWithData(data!,options: NSJsONReadingOptions())) as! Array<Dictionary<String,AnyObject>>storeInstance.saveData("Person",data: dataArray,IDString: kCanDBDefaultIDString)这里存储的是array数组
// singleton let storeInstance = canDB.sharedInstance // saving,indexing,reindexing new data storeInstance.saveData("Person",data: dataArray,IDString: kCanDBDefaultIDString) storeInstance.addindex("Person",indexes: ["name","Address.Home","Address.Work"]) storeInstance.reIndex("Person",IDString: kCanDBDefaultIDString) // loading all data let result = storeInstance.loadData("Person") for item in result { for (key,value) in (item as! NSDictionary) { print("\(key): \(value)",terminator: "") self.textVIEw?.text = self.textVIEw?.text.stringByAppendingString("\(key): \(value)\n") } self.textVIEw?.text = self.textVIEw?.text.stringByAppendingString("\n") } // loading data with custom query let resultWithquery = storeInstance.loadDataWithquery("SELECT * FROM Person WHERE name='John'") for item in resultWithquery { for (key,terminator: "") } } // remove methods storeInstance.removeData("Person") storeInstance.removeDataForID("Person",IDString: kCanDBDefaultIDString,IDsToDelete: ["19","17"])
canDB.swift 具体功能
import Foundationenum CanDBError: ErrorType { case Error(String)}let kCanDBDefaultIDString = "ID"class canDB: NSObject { static let sharedInstance = canDB() var database = FMDatabase() overrIDe init() { super.init() } func execute(command: String) throws { if !self.database.executeUpdate(command,withArgumentsInArray: nil) { throw CanDBError.Error("CanDBError: \(self.database.lastErrorMessage())") } } func openDatabase() throws { let documentsFolder = NSSearchPathForDirectorIEsInDomains(.documentDirectory,.UserDomainMask,true)[0] let path = documentsFolder + "/canDB.sqlite" self.database = FMDatabase(path: path) if !self.database.open() { throw CanDBError.Error("error opening the database") } } func createtable(tablename: String,IDString: String) throws { do { try self.execute("CREATE table IF NOT EXISTS " + tablename + " (_localID INTEGER PRIMARY KEY,\(IDString) TEXT,_JsonData TEXT);") } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } } func addindex(tablename: String,indexes: NSArray) throws { for index in indexes { do { try self.execute("ALTER table \(tablename) ADD ColUMN [\(index)] TEXT") } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } } } // todo: improve performance on reindexing big tables func reIndex(tablename: String,IDString: String) throws { let result = loadDataWithquery("SELECT * from \(tablename)") do { try self.saveData(tablename,data: result,IDString: IDString) } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } } func saveData(tablename: String,data: NSArray,IDString: String) throws { do { try self.createtable(tablename,IDString: IDString); } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } let indexesArray = self.getIndexesFortable(tablename) for record in data { if !NSJsONSerialization.isValIDJsONObject(record) { throw CanDBError.Error("invalID JsON") return } let JsonData = try! NSJsONSerialization.dataWithJsONObject(record,options: NSJsONWritingOptions.PrettyPrinted) let rawJsONString = Nsstring(data: JsonData,enCoding:NSUTF8StringEnCoding) let ID: AnyObject! = record.objectForKey(IDString) let selectquery = "SELECT * FROM \(tablename) WHERE \(IDString) = '\(ID)'" let result = self.loadDataWithquery(selectquery) if result.count > 0 { // custom columns var extraquery = "" for indexname in indexesArray { if (!indexname.isEqualToString("_localID") && !indexname.isEqualToString("_JsonData") && !indexname.isEqualToString(IDString)) { extraquery += ",[\(indexname)] = '\(record.valueForKeyPath(indexname as! String)!)' " } } if !self.database.executeUpdate("UPDATE \(tablename) set _JsonData = :rawJson \(extraquery) WHERE \(IDString) = '\(ID)'",withParameterDictionary: ["rawJson": "\(rawJsONString!)"]) { throw CanDBError.Error(self.database.lastErrorMessage()) } } else { // custom columns var extraIndexes = "" var extraValues = "" for indexname in indexesArray { if (!indexname.isEqualToString("_localID") && !indexname.isEqualToString("_JsonData")) { extraIndexes += ",[\(indexname)]" extraValues += ",'\(record.valueForKeyPath(indexname as! String)!)' " } } if !self.database.executeUpdate("INSERT INTO \(tablename) (_JsonData \(extraIndexes)) VALUES (:rawJson \(extraValues))",withParameterDictionary: ["rawJson": "\(rawJsONString!)"]) { throw CanDBError.Error(self.database.lastErrorMessage()) } } } } // remove all the data from a table func removeData(tablename: String) throws { do { try self.execute("DELETE FROM \(tablename)") } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } } // remove specific records func removeDataForID(tablename: String,IDString: String,IDsToDelete: NSArray) throws { var IDs = "" IDsToDelete.enumerateObjectsUsingBlock { (object,index,stop) -> VoID in if index == 0 { IDs = (object as! String) } else if index == (IDsToDelete.count - 1) { IDs = IDs + "," + (object as! String) } else { IDs = IDs + "," + (object as! String)} } do { try self.execute("DELETE FROM \(tablename) where \(IDString) in ( \(IDs) )") } catch CanDBError.Error(let message) { throw CanDBError.Error(message) } catch { throw CanDBError.Error("unkNown error") } } func loadData(tablename: String) -> NSArray { let query = "SELECT _JsonData from \(tablename)" let resultSet = self.database.executequery(query,withArgumentsInArray: nil) let result: NSMutableArray = [] while resultSet.next() { let JsonString = resultSet.stringForColumn("_JsonData") let JsonData: NSData = JsonString.dataUsingEnCoding(NSUTF8StringEnCoding)! let Json: AnyObject = try! NSJsONSerialization.JsONObjectWithData(JsonData,options: []) let JsonDictionary = Json as? NSDictionary result.addobject(JsonDictionary!) } return result as NSArray } // you can specify the query,but the result will be the _JsonData parsed into NSDictionary func loadDataWithquery(query: String) -> NSArray { let resultSet = self.database.executequery(query,options: []) let JsonDictionary = Json as? NSDictionary result.addobject(JsonDictionary!) } return result as NSArray } func loadRawDataWithquery(query: String) -> NSArray { let resultSet = self.database.executequery(query,withArgumentsInArray: nil) let result: NSMutableArray = [] while resultSet.next() { result.addobject(resultSet.resultDictionary()) } return result as NSArray } // helper func getIndexesFortable(tablename: String) -> NSMutableArray { // get the extra indexes let indexes = self.database.executequery("PRAGMA table_info(\(tablename))",withArgumentsInArray: nil) let indexesArray: NSMutableArray = [] while indexes.next() { let indexname = indexes.objectForColumnname("name") as! String indexesArray.addobject(indexname) } return indexesArray }} 总结 以上是内存溢出为你收集整理的swift ios 数据库存储全部内容,希望文章能够帮你解决swift ios 数据库存储所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)