SwiftFMDBの使用



Swift Fmdb Use



FMDBの機能:

  • FMDBはiOSプラットフォーム用のSQLiteデータベースフレームワークです
  • FMDBはSQLiteのC言語APIをOCにカプセル化します

FMDBの利点
1.使用するのがよりオブジェクト指向であり、多くの面倒で冗長なCコードを排除します。
2. Apple独自のCoreDataフレームワークと対比して、より軽量で柔軟性を高めます
3.マルチスレッドセーフなデータベース操作方法を提供し、データの混乱を効果的に防ぐためのトランザクション操作を提供します

コアクラス:FMDatabase

。 FMDatabase:FMDatabaseはsqliteデータベースを表します。データベースに対するすべての操作は、このクラスを介して渡されます。
1.executeStatements:複数のSQLを実行します
2.executeQuery:クエリステートメントを実行します
3.executeUpdate:クエリ、作成、削除、挿入、削除、更新以外のステートメントを実行します



。FMResultSet
FMDatabaseを使用してクエリを実行した後の結果セット

。 FMDatabaseQueue:データベースのマルチスレッド操作のためにFMDatabaseとシリアルキューを内部的にカプセル化し、トランザクションを提供します。これを使用することをお勧めします



  • inDatabase:パラメーターはクロージャであり、FMDatabaseオブジェクトはクロージャで取得できます。
  • inTransaction:トランザクションを使用します。

開く正しい方法:

カスタムツールクラス:

// // KySQLiteManager.swift // SQLiteTD // // Created by fangyukui on 2017/11/1. // Copyright © 2017 fangyukui. All rights reserved. // import UIKit import FMDB class KySQLiteManager { // singleton, thread safe open static let shared = KySQLiteManager() //Lazy loading FMDatabaseQueue fileprivate lazy var dbQueue:FMDatabaseQueue = { let documentPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last! as NSString let path = documentPath.appendingPathComponent('my.sqlite') let dbQueue = FMDatabaseQueue(path: path) return dbQueue }() init() { } ///MARK: Create a table open func createDBTable(){ let sql = 'create table if not exists t_stu(id integer primary key autoincrement,name varchar(20) not null,age integer default 60)' dbQueue.inDatabase { (db) in let result = db.executeUpdate(sql, withArgumentsIn: []) if result { Print('Create a table successfully') }else{ Print('Create a table failed') } } } ///MARK: Insert table data open func insertDBTable(){ / / Note: self-growth id does not need to be inserted, will report an error let sql = 'insert into t_stu(name,age) values ('fangyukui',23),('xiaoM',21)' dbQueue.inDatabase { (db) in let result = db.executeUpdate(sql, withArgumentsIn: []) if result { Print('insert data successfully') }else{ Print('Insert data failed') } } } ///MARK: Query table data open func queryDBTable(){ let sql = 'select * from t_stu' dbQueue.inDatabase { (db) in guard let resultSet = db.executeQuery(sql, withArgumentsIn: []) else { return } while resultSet.next() == true { let name = resultSet.string(forColumn: 'name') let age = resultSet.int(forColumn: 'age') print(name! + '(age)') } } } ///MARK: Execute multiple SQL statements open func executeStms (){ let sql = 'insert into t_stu(name,age) values ('google',21)insert into t_stu(name,age) values ('apple',23)' dbQueue.inDatabase { (db) in db.executeStatements(sql) } } ///MARK: transaction operation open func transaction(){ let sql1 = 'insert into t_stu(name,age) values ('google',21)' let sql2 = 'insert into1 t_stu(name,age) values ('apple',15)' dbQueue.inTransaction { (db, rollback) in let r1 = db.executeUpdate(sql1, withArgumentsIn: []) let r2 = db.executeUpdate(sql2, withArgumentsIn: []) if r1 && r2 { Print('Transaction operation succeeded') }else{ Print('data error, rollback') rollback.pointee = true } } } }