swift3 数据库_swift如何在数据库上存储数据 - CSDN
精华内容
参与话题
  • iOS-SQLite在项目中实际使用(Swift3)

    千次阅读 2016-10-25 14:50:21
    创建数据库管理类SQLiteManager 设置类方法创建单例对象 Swift 中单例对象可以直接输出定义的自身类内的成员变量. class SQLiteManager: NSObject { //MARK: - 创建类的静态实例变量即为单例对象 l

    转载请注明出处:http://blog.csdn.net/qxuewei/article/details/52913622

    这里写图片描述

    创建数据库管理类SQLiteManager

    设置类方法创建单例对象
    Swift 中单例对象可以直接输出定义的自身类内的成员变量.

     class SQLiteManager: NSObject {
        //MARK: - 创建类的静态实例变量即为单例对象 let-是线程安全的
        static let instance = SQLiteManager()
        //对外提供创建单例对象的接口
        class func shareInstance() -> SQLiteManager {
            return instance
        }
    }

    操作数据库

    首先需要在项目中导入libsqlite3.tbd框架
    这里写图片描述

    SQLite3 框架是一套 C 语言的框架,直接在swift中使用首先需要添加桥接文件
    在swift中使用OC/C++/C等文件都需要这个桥接文件.
    这里写图片描述

    创建完桥接头文件还需要将桥接头文件配置到项目中
    这里写图片描述

    然后就可以在swift项目中愉快的使用C语言的各种接口方法了.

    打开数据库

    开启数据库

    class SQLiteManager: NSObject {
        //MARK: - 创建类的静态实例变量即为单例对象 let-是线程安全的
        static let instance = SQLiteManager()
        //对外提供创建单例对象的接口
        class func shareInstance() -> SQLiteManager {
            return instance
        }
        //MARK: - 数据库操作
        //定义数据库变量
        var db : OpaquePointer? = nil
        //打开数据库
        func openDB() -> Bool {
            //数据库文件路径
            let dicumentPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last
            let DBPath = (dicumentPath! as NSString).appendingPathComponent("appDB.sqlite")
            let cDBPath = DBPath.cString(using: String.Encoding.utf8)
            //打开数据库
            //第一个参数:数据库文件路径  第二个参数:数据库对象
    //        sqlite3_open(<#T##filename: UnsafePointer<Int8>!##UnsafePointer<Int8>!#>, <#T##ppDb: UnsafeMutablePointer<OpaquePointer?>!##UnsafeMutablePointer<OpaquePointer?>!#>)
            if sqlite3_open(cDBPath, &db) != SQLITE_OK {
                print("数据库打开失败")
            }
            return creatTable();
        }
        //创建表
        func creatTable() -> Bool {
            //建表的SQL语句
            let creatUserTable = "CREATE TABLE IF NOT EXISTS 't_User' ( 'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age' INTEGER,'icon' TEXT);"
            let creatCarTable = "CREATE TABLE IF NOT EXISTS 't_Car' ('ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'type' TEXT,'output' REAL,'master' TEXT);"
            //执行SQL语句-创建表 依然,项目中一般不会只有一个表
            return creatTableExecSQL(SQL_ARR: [creatUserTable,creatCarTable])
        }
        //执行建表SQL语句
        func creatTableExecSQL(SQL_ARR : [String]) -> Bool {
            for item in SQL_ARR {
                if execSQL(SQL: item) == false {
                    return false
                }
            }
            return true
        }
        //执行SQL语句
        func execSQL(SQL : String) -> Bool {
            // 1.将sql语句转成c语言字符串
            let cSQL = SQL.cString(using: String.Encoding.utf8)
            //错误信息
            let errmsg : UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? = nil
            if sqlite3_exec(db, cSQL, nil, nil, errmsg) == SQLITE_OK {
                return true
            }else{
                print("SQL 语句执行出错 -> 错误信息: 一般是SQL语句写错了 \(errmsg)")
                return false
            }
        }
    }
    

    一般在app启动开启数据库并建表

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            //一般在程序启动时开始数据库并建表
            if SQLiteManager.shareInstance().openDB() {
                print("开启数据库成功!")
            }
            return true
        }

    数据库内SQL操作

    //执行SQL语句
        func execSQL(SQL : String) -> Bool {
            // 1.将sql语句转成c语言字符串
            let cSQL = SQL.cString(using: String.Encoding.utf8)
            //错误信息
            let errmsg : UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? = nil
            if sqlite3_exec(db, cSQL, nil, nil, errmsg) == SQLITE_OK {
                return true
            }else{
                print("SQL 语句执行出错 -> 错误信息: 一般是SQL语句写错了 \(errmsg)")
                return false
            }
        }

    项目中的Model自定义对象可以自定义一个将自身插入数据库的方法

    //将自身插入数据库接口
        func insertSelfToDB() -> Bool {
            //插入SQL语句
            let insertSQL = "INSERT INTO 't_User' (name,age,icon) VALUES ('\(name!)',\(age),'\(icon!)');"
            if SQLiteManager.shareInstance().execSQL(SQL: insertSQL) {
                print("插入数据成功")
                return true
            }else{
                return false
            }
        }

    模拟插入若干用户

    for i in 1...7 {
                let name = "name_\(i)"
                let age = arc4random_uniform(18).hashValue + i
                let icon = "http://qiuxuewei.com/icon\(i).png"
                let user : User = User(name: name, age: age, icon: icon)
                if user.insertSelfToDB() {
                    print("第 \(i) 个用户插入成功!")
                }
            }
        }

    如果需要更新数据库对应表中数据,直接调用SQL执行方法即可实现

    //修改头像封装方法
    func changeIcon(newIcon : String) {
            //包装修改头像的SQL语句
            let changeIconSQL = "UPDATE 't_User' SET icon='\(newIcon)' WHERE name='name_6'"
            if SQLiteManager.shareInstance().execSQL(SQL: changeIconSQL) {
                print("name_6 头像修改成功!")
            }
        }
    
    

    查询数据库中对应表中所有数据

    在SQLiteManager中封装一个类方法,可以直接传入SQL语句输出数据库中存储的数据
    其中swift3中对 UnsafePointer 转 String 做了改动
    let s = String(cString: yourCharPointer)
    参考:http://stackoverflow.com/questions/39533320/swift-3-convert-a-null-terminated-unsafepointeruint8-to-a-string

    //查询数据库中数据
        func queryDBData(querySQL : String) -> [[String : AnyObject]]? {
            //定义游标对象
            var stmt : OpaquePointer? = nil
    
            //将需要查询的SQL语句转化为C语言
            if querySQL.lengthOfBytes(using: String.Encoding.utf8) > 0 {
                let cQuerySQL = (querySQL.cString(using: String.Encoding.utf8))!
                //进行查询前准备操作
                // 1> 参数一:数据库对象
                // 2> 参数二:查询语句
                // 3> 参数三:查询语句的长度:-1
                // 4> 参数四:句柄(游标对象)
    
                if sqlite3_prepare_v2(db, cQuerySQL, -1, &stmt, nil) == SQLITE_OK {
                    //准备好之后进行解析
                    var queryDataArrM = [[String : AnyObject]]()
                    while sqlite3_step(stmt) == SQLITE_ROW {
                        //1.获取 解析到的列(字段个数)
                        let columnCount = sqlite3_column_count(stmt)
                        //2.遍历某行数据
                        var dict = [String : AnyObject]()
                        for i in 0..<columnCount {
                            // 取出i位置列的字段名,作为字典的键key
                            let cKey = sqlite3_column_name(stmt, i)
                            let key : String = String(validatingUTF8: cKey!)!
    
                            //取出i位置存储的值,作为字典的值value
                            let cValue = sqlite3_column_text(stmt, i)
                            let value =  String(cString:cValue!)
                            dict[key] = value as AnyObject
                        }
                        queryDataArrM.append(dict)
                    }
                    return queryDataArrM
                }
            }
            return nil
        }
    
    

    在自定义模型中有必要定义个工厂方法可将数据库对应表中所有数据取出,以模型数组的形式输出

     //MARK: - 类方法
        //将本对象在数据库内所有数据全部输出
        class func allUserFromDB() -> [User]? {
            let querySQL = "SELECT name,age,icon FROM 't_User'"
            //取出数据库中用户表所有数据
            let allUserDictArr = SQLiteManager.shareInstance().queryDBData(querySQL: querySQL)
            print(allUserDictArr)
    
            //将字典数组转化为模型数组
            if let tempUserDictM = allUserDictArr {
                // 判断数组如果有值,则遍历,并且转成模型对象,放入另外一个数组中
                var userModelArrM = [User]()
                for dict in tempUserDictM {
                    userModelArrM.append(User(dict: dict))
                }
                return userModelArrM
            }
            return nil
        }
    

    当然,github已经上传源代码:https://github.com/qxuewei/Swift-test/tree/master/SQLite%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C-Swift

    展开全文
  • Swift 操作数据库

    千次阅读 2015-07-21 19:05:35
    操作数据库 以一个实例展示输入名称和年龄保存到数据库,然后在另外一个tab里面显示,围绕一个TableView 来完成一个对数据的增、删、改、查的操作 。 具体实现代码: ...3:定义对象读取数据库: NSManag
    操作数据库
    
    以一个实例展示输入名称和年龄保存到数据库,然后在另外一个tab里面显示,围绕一个TableView 来完成一个对数据的增、删、改、查的操作 。
    具体实现代码:


    1:创建工程的时候需要选择Use Core Data 使用数据库是Sqlit。
    4790.png 
    2:导入 CoreData
    283066.png 
    3:定义对象读取数据库: NSManagedObjectContext
    706651.png 
    4:创建表:创建表的时候首写字母一定是大写不然会提示出错
    775849.png
    5:获取数据连接,相当于创建一个连接池connection,用这个对象就可以保存,查询数据。
    635744.png 

      context = ( UIApplication.sharedApplication().delegate asAppDelegate ).managedObjectContext

    6:创建访问表的变量。

    584225.png
    7:设置字段值:

    var row:AnyObject  =  NSEntityDescription.insertNewObjectForEntityForName("USERS", inManagedObjectContext: context!)

            if(name.text.isEmpty){

                UIAlertView(title: "提示", message: "姓名不能为空", delegate: nil, cancelButtonTitle: "确认").show()

                name.becomeFirstResponder()  //得到焦点

                return

            }

            row.setValue(name.text, forKey: "name")

            if  let _age  = age.text.toInt() {   //可以根据此种方法判断是否是int类型

                var _age:Int  = age.text.toInt()!

                if(_age < 0){

                    UIAlertView(title: "提示", message: "年龄必须为正数", delegate: nil, cancelButtonTitle: "确认").show()

                    age.becomeFirstResponder()

                    return

                }

                row.setValue(_age, forKey: "age")

            }else{

                UIAlertView(title: "提示", message: "年龄必须为正数", delegate: nil, cancelButtonTitle: "确认").show()

                age.becomeFirstResponder()

                return

            }



    527986.png
    8:保存操作,保存数据

    context?.save(nil)

    646799.png 

    9:读取数据:将数据读取到NString

      context = ( UIApplication.sharedApplication().delegate asAppDelegate ).managedObjectContext!

             dataarry = context.executeFetchRequestNSFetchRequest(entityName: "USERS"), error: nil)!

    336201.png

    10:打开表可以看到我们保存的数据:(大家可以去网上下载Sqlit工具,我用的Navict 感觉很不错的支持mysql、orcal、sqlit 等)
    457294.png


    11:更新数据:

        @IBAction func update(sender: AnyObject) {

            data.setValue(_uname.text, forKey: "name")

            data.setValue(_uage.text.toInt(), forKey: "age")

            data.managedObjectContext?.save(nil)


            dismissViewControllerAnimated(true, completion: nil)


    12:删除

    / Override to support editing the table view.

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

            if editingStyle == .Delete {

                // Delete the row from the data source

                //tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

                context.deleteObject(dataarry[indexPath.rowasNSManagedObject)

                context.save(nil);

                refreshData()

            } else if editingStyle == .Insert {

                // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

            }    


        }


    import UIKit

    import CoreData

    class ViewController: UIViewController {


        @IBOutlet weak var age: UITextField!

        @IBOutlet weak var name: UITextField!

        var  context: NSManagedObjectContext!

        override func viewDidLoad() {

            super.viewDidLoad()

            // Do any additional setup after loading the view, typically from a nib.

             context = ( UIApplication.sharedApplication().delegate asAppDelegate ).managedObjectContext

        }


        override func didReceiveMemoryWarning() {

            super.didReceiveMemoryWarning()

            // Dispose of any resources that can be recreated.

        }



        @IBAction func saveAction(sender: AnyObject) {

            var row:AnyObject  =  NSEntityDescription.insertNewObjectForEntityForName("USERS", inManagedObjectContext: context!)

            if(name.text.isEmpty){

                UIAlertView(title: "提示", message: "姓名不能为空", delegate: nil, cancelButtonTitle: "确认").show()

                name.becomeFirstResponder()  //得到焦点

                return

            }

            row.setValue(name.text, forKey: "name")

            if  let _age  = age.text.toInt() {   //可以根据此种方法判断是否是int类型

                var _age:Int  = age.text.toInt()!

                if(_age < 0){

                    UIAlertView(title: "提示", message: "年龄必须为正数", delegate: nil, cancelButtonTitle: "确认").show()

                    age.becomeFirstResponder()

                    return

                }

                row.setValue(_age, forKey: "age")

            }else{

                UIAlertView(title: "提示", message: "年龄必须为正数", delegate: nil, cancelButtonTitle: "确认").show()

                age.becomeFirstResponder()

                return

            }

            context?.save(nil)

            age.resignFirstResponder()  //第一响应事件取消,消除键盘操作

        }

    }


    展开全文
  • swift-创建数据库

    2018-10-31 11:48:00
    import UIKit class LoginDatabase: NSObject { var fmdb = FMDatabase() func shareManager() -&gt; LoginDatabase { let manager = LoginDatabase() return manager } o...
    
    import UIKit
    
    class LoginDatabase: NSObject {
    
        var fmdb = FMDatabase()
        
        func shareManager() -> LoginDatabase {
            let manager = LoginDatabase()
            return manager
        }
        override init() {
            super.init()
            
            let dbPath:NSString = NSHomeDirectory() + "/Documents/MySwift.db" as NSString
            MyPrint(message: dbPath)
            fmdb = FMDatabase.init(path: dbPath as String!)
            if fmdb.open() {
                let sql = "create table if not exists CurrentSellocdeDB(id integer primary key autoincrement,user_id varchar(30),user_password varchar(256),SellerCode varchar(30),user_name varchar(50),Role varchar(50),AreaID varchar(50),Area_Name varchar(50),DepID varchar(50),Dept_Name varchar(50),Manager_Id varchar(50),Manager_Name varchar(50),Manager_Role varchar(50),contact_phone varchar(50),Other varchar(50),HandlingMatters varchar(20),IsJob varchar(20),ProvinceId varchar(50),ProvinceName varchar(20),WorkTime varchar(20),AfterTime varchar(20),CreatTime varchar(20),qubanName varchar(20),QuAreaID varchar(20))"
                let success = fmdb.executeUpdate(sql, withArgumentsIn:[])
                if !success{
                    MyPrint(message: fmdb.lastError())
                }
            }
        }
        func inserModel(model:LoginModel) -> Void {
            
            let sql:String = "insert into CurrentSellocdeDB(user_id,user_password,SellerCode,user_name,Role,AreaID,Area_Name,DepID,Dept_Name,Manager_Id,Manager_Name,Manager_Role,contact_phone,Other,HandlingMatters,IsJob,ProvinceId,ProvinceName,WorkTime,AfterTime,CreatTime,qubanName,QuAreaID) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
            
            let success = fmdb.executeUpdate(sql, withArgumentsIn: [])
            if !success {
                MyPrint(message: fmdb.lastError())
            }
        }
        func selectAllData() -> NSMutableArray {
            let sql = "select * from LoginDatabase"
            let set:FMResultSet = fmdb.executeQuery(sql, withArgumentsIn: [])
            let array = NSMutableArray()
            
            while set.next() {
                let model = LoginModel()
                model.Dept_Name = set.string(forColumn: "Dept_Name")
                model.Manager_Name = set.string(forColumn: "Manager_Name")
                model.user_name = set.string(forColumn: "user_name")
                model.user_id = set.string(forColumn: "user_id")
                model.user_password = set.string(forColumn: "user_password")
                model.Role = set.string(forColumn: "Role")
                model.SellerCode = set.string(forColumn: "SellerCode")
                model.Manager_Id = set.string(forColumn: "Manager_Id")
                model.ProvinceId = set.string(forColumn: "ProvinceId")
                model.DepID = set.string(forColumn: "DepID")
                model.CreatTime = set.string(forColumn: "CreatTime")
                model.ProvinceName = set.string(forColumn: "ProvinceName")
                model.CreatTime = set.string(forColumn: "CreatTime")
                model.qubanName = set.string(forColumn: "qubanName")
                model.QuAreaID = set.string(forColumn: "QuAreaID")
              
                array.add(model)
            }
            return array
        }
      
    }
    

     

    展开全文
  • 在Objective-C中,用于...在日常开发中,虽然经常需要储存某些用户的个人信息之类的,这样我们用的更多的是plst和preference,但是对于大批量的数据,比如说TableView中的Data数据进行处理,还是需要数据库来进行处理。

    在Objective-C中,用于数据持久化的方法有以下几种:

    1. 使用plist文件
    2. 使用preference 保存数据

      1. NSKeyArchiver 归档
    3. Sqlite3
    4. CoreData

    在日常开发中,虽然经常需要储存某些用户的个人信息之类的,这样我们用的更多的是plst和preference,但是对于大批量的数据,比如说TableView中的Data数据进行处理,还是需要数据库来进行处理。

    CoreData是基于Sqlite的封装,但是貌似被黑的很惨,这里就暂时不用了。而且因为我自己尝试使用过CoreData,感觉使用的话,不仅仅需要用到图形界面,还要编写代码。对于我这个纯代码党来说,感觉有点复杂。希望苹果公司将来能够对其进行不断改良吧。

    而在移动端我们最最常用的还是Sqlite,在OC中,我们有耳熟能详的FMDB,但是在Swift中,我们能使用什么呢?在通过网上搜索了一段时间之后。SQLite.swift映入了我眼帘(我才不会说因为Realm的文档太复杂而不去看他了呢!)

    安装方法


    对于使用cocoapods的我来说,第三方库的安装其实相对而言十分简单的。

    1. 只要在该工程下使用vim podfile创建对应的podfile文件
    2. 输入对应的第三方库的名字和版本号:pod 'SQLite.swift', '~> 0.10.1',由于是Swift我们这里还需要换行输入use_frameworks!这样才能将对应的库导入到我们的工程中。
    3. esc后输入:wq,保存文本内容
    4. 输入pod install安装对应库就可以了

    如果有小伙伴不知道怎么安装cocoapods,可以参照我的这篇文章来进行安装

    基本介绍


    这个第三方框架有着自己详细的官方文档,各位可以点击进去自行查看。不过都是英文的,可能阅读起来有点麻烦。所以我在这简单的介绍下相关的内容。

    基本使用


    创建

    对于数据库而言,主要的创建就是数据库的创建和表的创建

    数据库的创建

    只要直接获取就可以,这个库会帮我们解决如果文件不存在的问题。

    let db = try Connection("path/to/db.sqlite3")

    表的创建

    首先我们通过库中的Table类来获取这个对象

    let table = Table("tableName")

    然后我们创建我们需要在表中的放入的元素。
    这里就需要介绍下
    Sqlite中存在的值类型和类中的变量的对应情况了。

    Swift Type SQLite Type
    Int64 INTEGER
    Double REAL
    String TEXT
    nil NULL
    SQLite.Blob BLOB

    然后就是创建我们想要的元素对象了
    let id = Column(“id”)
    let name = Column(“PersonName”)

    其中创建的时候中<>中的值就是我们设置的元素,()中的内容就是元素名

    在SQLite中的所有涉及到元素的增删改查的所有内容都是使用column对象来进行处理的。

    而创建的话也十分简单

    try db.run(table.create{ t in 
        t.column(id,primaryKey:true)
        t.column(name)
    })

    当然肯定有人会问很多问题

    Q
    :表如果已经存在了,那怎么办?元素的唯一性怎么办?主键怎么设置?……

    A:别急,听我慢慢道来。

    这里框架里面已经给我们提供了很多可以遍历的方法

    解决表已经存在的问题

    我们可以翻看他的源代码中的Table类的创建函数create方法,这个创建方法是这么写的

    func create(temporary temporary: Bool = false, ifNotExists: Bool = false, @noescape block: TableBuilder -> Void) -> String

    很明显他里面已经帮我们考虑了我们平常使用中的常用方法,其中temporary就是创建虚拟表(也就是存放在内存中,不存放在实际沙盒路径中的数据表),ifNotExists是判断是否已经存在对应的表文件。block是用来创建对应的TableBuilder对象。

    解决元素的相关属性问题

    在create的时候我们使用了闭包,这样就可以在每次执行的时候捕获对象,从而使得每次都能对表进行处理。通过查看他的源码,我们发现这里面的t实际上就是一个TableBuilder对象。我们可以用TableBuilder的column方法

    func column(name: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?)

    当然我们不会直接调用这个方法,毕竟这个方法那么长,不符合Swift编码规范,所以我们可以使用作者已经缩略好的内容,从而方便使用,这里就粗略的介绍下对应变量:

    1. name:对应的Expression类型,也就是我们前面创建的Express<>()的变量
    2. Datetype:元素的类型,就是前面表格中的SwiftType,一般代码会帮我们自动设置好
    3. primaryKey:判断是否要设置为主键
    4. null:是否可以置为null,
    5. unique:是否键值唯一
    6. check:判断对应的内容是否符合某种表解析,比如说:email.check(“%@%”),
    7. reference:添加引用
    8. collate:指定排序规则
    9. defaultValue:默认值

    数据的增删改查

    增加

    try! db.run(users.insert(email <- "alice@mac.com"))

    这个返回的是一个Int,即插入对应的行的行id

    删除

    try db.run(alice.delete())

    这个返回的是一个Int,即删除行的数目

    那如果需要删除某一行,那就需要使用对应的筛选函数了(在查找中会提到)

    修改

    try db.run(alice.update(email <- "alice@me.com"))

    这个返回的是一个Int,即修改行的数目

    查找

    查找和上面的略有不同,因为我们查找,肯定是为了查找某一行的内容,或者说需要对内容进行排列,或者左右连接其他表等等。这个时候我们就需要使用其他的函数了。(因为框架里面没有select方法)

    在框架中查找对应的是内容的QueryType的函数主要有这几个filter(筛选),join(表连接),group(group by),limit(对筛选条件进行约束),这几个函数与日常使用的SQL语句使用基本上一致,所以在这不过多解释。但是在使用filter的时候,如果判断值为某个值,那么需要用到column。所以在每次选择前,需要对需要用到的值创建对象。

    但是由于选出的值需要进行展示,而且不同人的展示方式不同,比如说有的人要取和,有的人要输出。

    除此之外,对于筛选的内容,框架的作者使用链式的方法,从而在编码的过程中更加方便,比如说下面这条语句,很明显让人一读就能力姐他到底是什么意思。

    let query = users.select(email)           // SELECT "email" FROM "users"
                     .filter(name != nil)     // WHERE "name" IS NOT NULL
                     .order(email.desc, name) // ORDER BY "email" DESC, "name"
                     .limit(5, offset: 1)     // LIMIT 5 OFFSET 1

    数据转换

    这个时候单纯的table是不够用了,作者就把方法写到了db里面。

    1. scalar:聚合,用来获得对应想要的值,一般用于获得count,max,min,avg,sum,totle等
    2. prepare:获得所有元素值,然后使用for循环进行遍历(在for循环中,如果想要某个元素的值,你需要使用let idNum = item[id]id为column对象)
    3. pluck:获得一行,如果是选取了所有,那么获得第一行
    4. run:用来执行delete,update,insert,create语句
    5. trace:每次执行sql语句都要执行这里面的内容。(db.trace { print($0) }在执行db的所有方法前,使用这句,会在每次执行的时候都输出sql语句)
    6. excuse:直接执行SQL语句,为了方便写习惯了SQL语句的人。

    删除

    删除表可以直接使用drop()方法而删除某一标签,即dropIndex,则调用dropIndex方法。

    除此之外,之所以这个框架那么好用,他还重载了符号。比如说你需要写入某个column,你可以使用<-,这大大的方便了代码的可读性,从而提高了理解的效率。

    展开全文
  • FMDB 增删改查的小 demo,有兴趣的可以去下载看一下~_~Swift 版本 Demo地址
  • RealmSwift数据库查看

    2019-10-18 14:49:53
    那么数据库的文件肯定也在这个路径下面,只是可能还有子目录。 沙盒路径 要找到数据库路径,就要找到当前应用的沙盒路径: //获取当前应用沙盒路径 var path=NSSearchPathForDirectoriesInDomains(.document...
  • swift ios 数据库存储

    2016-07-05 18:32:07
    swift 之本地数据库CoreData http://www.jianshu.com/p/8eaddcac1fd5 _CoreData无法找到对应实体类问题: http://www.th7.cn/Program/IOS/201411/314502.shtml swift支持多线程操作数据库类库-CoreDataManager: ...
  • Swift-Realm数据库的使用详解

    千次阅读 2018-05-31 14:47:43
    Swift-Realm数据库的使用详解 概述 Realm 是一个跨平台的移动数据库引擎,其性能要优于 Core Data 和 FMDB - 移动端数据库性能比较, 我们可以在 Android 端 realm-java,iOS端:Realm-Cocoa,同时支持 OC 和 ...
  • SQLite轻量级数据库在移动应用中使用非常普遍,但是目前的库是C编写的,为了方便使用,对SQLite相关的操作用Swift进行了封装。这个封装代码使用了一个开源项目SQLiteDB,地址是:https://github.com/fahimf/sqlitedb...
  • 创建数据库管理类 DataManager.swift import GRDB struct DataBaseName { /// 数据库名字 static let test = "test.db" } /// 数据库表名 struct TableName { /// 学生 static let student = "student" } ///...
  • Swift代码库之完整的数据读取代码 很多新手经常会困惑,如何存储和读取数据呢? 最佳的解决方案就是使用Sqlite。下面我就介绍一个读取数据的小例子 数据长成什么样 sqlite数据库截图 读取代码 func readData...
  • RealmSwift数据库框架

    2019-10-18 14:24:57
    由于数据库框架的使用本身就有一定复杂度,所以这里我们先讲解这个数据库框架的一个基础使用,后面再讲解如何将他运行到项目中。 定义模型 该框架是ORM框架,所以存储和查询都是对象,不用我们手写SQL语句;第一步...
  • Swift数据库框架Realm的使用

    千次阅读 2018-12-11 17:46:20
    不同于SQLite和CoreData,Realm跨平台简单易用,并可以监听数据库的变化。 1.使用CocoaPods导入Realm pod 'RealmSwift', '3.11.0' 2.创建Realm.Configuration配置文件 import Foundation import RealmSw...
  • (本文代码已升级至Swift4) 1,什么是Realm Realm 于2014 年7月发布,是一个跨平台的移动数据库引擎,专门为移动应用的数据持久化而生。其目的是要取代 Core Data 和 SQLite。 2,关于Realm,你要知道下面几...
  • Swift-->Realm1.0.2 数据库上手指南

    千次阅读 2016-08-28 21:53:56
    IOS中, 替代Core Data的数据库框架. 比Core Data的配置简单N倍.强烈建议查看官网文档: 1.0.2 英文文档: https://realm.io/docs/swift/latest/ 1.0.0中文文档: https://realm.io/cn/docs/swift/latest/1:Realm的库...
  • Swift 中使用 SQLite——打开数据库

    千次阅读 2016-03-16 00:32:53
    这是关于Swift中使用SQLite的系列文章,整个系列文章分别从打开、增、删、改、查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开。
  • 摘要:网上查询OHMySQL,大多是用OC语言写的例子,我现在写一个swift的例子。另,很多文章都说到APP直连数据库是不安全的。 PS:安装OHMySQL我是用CocoPods快速导入的,在Podfile文件中加上 pod 'OHMySQL' ,然后在...
  • 一、配置使用SQLite时的Swift框架工程环境 步骤如下: 1、点击项目名称 - Linked Frameworks and Libraries - “+” - 搜索“libsqlite3.dylib” - 然后点击Add 【访问SQLite数据库需要使用SQLite官方提供的...
  • 本篇博客我们来聊聊MySQL数据库的连接与操作。如果你本地没有MySQL数据库的话,需要你先安装MySQL数据库。在Mac OS中使用brew包管理器进行MySQL的安装是及其方便的。安装MySQL的命令为:brew install mysql。本篇...
  • 今天给大家带来的是堪称是一个可以替代SQLite,Core Data 的以及ORMlibraries的轻量级数据库—Realm移动端数据库。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及...
1 2 3 4 5 ... 20
收藏数 16,736
精华内容 6,694
关键字:

swift3 数据库