SQLite3

使用

 //******************** 5.3 SQLite3存储和读取数据
     func use_SQLite3()
     {
         //声明一个Documents下的路径
         var dbPath = NSHomeDirectory() + "/Documents/SwiftClassDB.sqlite"

         //判断数据库文件是否存在
         if !NSFileManager.defaultManager().fileExistsAtPath(dbPath)
         {
             //获取安装包内数据库路径
             var bundleDBPath:String? = NSBundle.mainBundle().pathForResource("SwiftClassDB", ofType: "sqlite")

             //将安装包内数据库拷贝到Documents目录下
             NSFileManager.defaultManager().copyItemAtPath(bundleDBPath!, toPath: dbPath, error: nil)
         }

         //打开数据库
         let dbOperation = DatabaseOperations(dbPath: dbPath)

         //添加一张表
         dbOperation.createTable();

         //插入一条信息, 通过Person对象来传值
         let person:Person = Person(name: )

         dbOperation.addUser(person)

         //查询
         let personArray:[Person] = dbOperation.readAllUsers()
         println("共搜索到:\(personArray.count) 条数据" )

         //更新
         dbOperation.updateUser("刘明洋", toName: "刘蕙通")

         //删除
         dbOperation.deleteUser("刘蕙通")

         //关闭数据库
         dbOperation.colseDb()

     }

     //******************** 5.4 Core Data
     func use_CoreData()
     {
         //参见工程  LMYCoreData
     }

数据操作

 class DatabaseOperations {

     //不透明指针,对应C语言里面的void *,这里指sqlite3指针
     private var db:COpaquePointer = nil

     //初始化方法打开数据库
     required init(dbPath:String)
     {
          println("db path:" + dbPath)

         //String类的路径,转换成cString
         let cpath = dbPath.cStringUsingEncoding(NSUTF8StringEncoding)

         //打开数据库
         let error = sqlite3_open(cpath!, &db)

         //数据库打开失败处理
         if error != SQLITE_OK {
             sqlite3_close(db)
         }
     }

     deinit{
         self.colseDb()
     }

     //关闭数据库
     func colseDb(){

         sqlite3_close(db)
     }

     //代码创建表
     func createTable() -> Bool{

         //sql语句
         var sql = "CREATE TABLE UserTable(id INTEGER PRIMARY KEY  AUTOINCREMENT NOT NULL, username TEXT NOT NULL, password TEXT NOT NULL, email TEXT, age INTEGER)"

         //执行sql语句
         var execResult = sqlite3_exec(db, sql.cStringUsingEncoding(NSUTF8StringEncoding)!, nil, nil, nil);

         //判断是否执行成功
         if (execResult != SQLITE_OK) {
             return false
         }

         return true
     }

     //插入一条信息
     func addUser(user: Person) -> Bool
     {
         //sql语句
         var sql = "INSERT INTO UserTable (username, password, email, age) VALUES (?, ?, ?, ?);";
         //sql语句转换成cString类型

         var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)

         //sqlite3_stmt 指针
         var stmt:COpaquePointer = nil

         //1.编译sql
         let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &stmt, nil)

         //判断如果失败,获取失败信息
         if prepare_result != SQLITE_OK {
             sqlite3_finalize(stmt)
             if let error = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         let intTran = UnsafeMutablePointer<Int>(bitPattern: -)
         let tranPointer = COpaquePointer(intTran)
         let transient = CFunctionPointer<((UnsafeMutablePointer<()>) -> Void)>(tranPointer)

         //2.bind 绑定参数
         //第2个参数:索引从1开始
         //最后一个参数为函数指针
         sqlite3_bind_text(stmt, , user.name!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient);
         sqlite3_bind_text(stmt, , user.password!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient);
         sqlite3_bind_text(stmt, , user.email!.cStringUsingEncoding(NSUTF8StringEncoding)!, -, transient);
         sqlite3_bind_int(stmt, , CInt(user.age!));

         //3.step执行
         var step_result = sqlite3_step(stmt)

         //判断执行结果,如果失败,获取失败信息
         if step_result != SQLITE_OK && step_result != SQLITE_DONE {
             sqlite3_finalize(stmt)
             if let err = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         //4.finalize
         sqlite3_finalize(stmt);

         return true
     }

     //查询
     func readAllUsers() -> [Person]{

         //声明一个Person对象数组(查询的信息会添加到该数组)
         var usersArr = [Person]()

         //查询sql语句
         var sql = "SELECT * FROM UserTable;";

         //sqlite3_stmt 指针
         var stmt:COpaquePointer = nil
         var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)

         //1.编译sql
         let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &stmt, nil)
         if prepare_result != SQLITE_OK {
             sqlite3_finalize(stmt)
             if let error = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"
                 println(msg)
                 self.alert(msg)
             }
             return usersArr
         }

         //2.step
         while (sqlite3_step(stmt) == SQLITE_ROW) {
             var user = Person()

             //循环 从数据库获取数据,添加到数组中
             let cName = UnsafePointer<CChar>(sqlite3_column_text(stmt, ))
             let cPwd = UnsafePointer<CChar>(sqlite3_column_text(stmt, ))
             let cEmail = UnsafePointer<CChar>(sqlite3_column_text(stmt, ))
             let cAge = sqlite3_column_int(stmt, )

             user.name = String.fromCString(cName)
             user.password = String.fromCString(cPwd)
             user.email = String.fromCString(cEmail)
             user.age = Int(cAge)

             usersArr += [user]
         }

         //3.finalize
         sqlite3_finalize(stmt);

         return usersArr
     }

     //更新一条信息
     func updateUser(name: String , toName:String) -> Bool
     {
         //更新sql语句
         var sql = "update UserTable set username = '\(toName)' where username = '\(name)'";

         //sqlite3_stmt 指针
         var stmt:COpaquePointer = nil
         var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)

         //1.编译sql
         let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &stmt, nil)

         //判断如果失败,获取失败信息
         if prepare_result != SQLITE_OK {
             sqlite3_finalize(stmt)
             if let error = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         //3.step执行
         var step_result = sqlite3_step(stmt)

         //判断执行结果,如果失败,获取失败信息
         if step_result != SQLITE_OK && step_result != SQLITE_DONE {
             sqlite3_finalize(stmt)
             if let err = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         //4.finalize
         sqlite3_finalize(stmt);

         return true
     }

     //删除一条信息
     func deleteUser(username: String) -> Bool
     {
         //删除sql语句
         var sql = "delete from UserTable  where username = '\(username)'";

         //sqlite3_stmt 指针
         var stmt:COpaquePointer = nil
         var cSql = sql.cStringUsingEncoding(NSUTF8StringEncoding)

         //1.编译sql
         let prepare_result = sqlite3_prepare_v2(self.db, cSql!, -, &stmt, nil)

         //判断如果失败,获取失败信息
         if prepare_result != SQLITE_OK {
             sqlite3_finalize(stmt)
             if let error = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to prepare SQL: \(sql), Error: \(error)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         //3.step执行
         var step_result = sqlite3_step(stmt)

         //判断执行结果,如果失败,获取失败信息
         if step_result != SQLITE_OK && step_result != SQLITE_DONE {
             sqlite3_finalize(stmt)
             if let err = String.fromCString(sqlite3_errmsg(self.db)) {
                 let msg = "SQLiteDB - failed to execute SQL: \(sql), Error: \(err)"
                 println(msg)
                 self.alert(msg)
             }
             return false
         }

         //4.finalize
         sqlite3_finalize(stmt);

         return true
     }

     //定义一个报警器
     func alert(msg:String) {
         dispatch_async(dispatch_get_main_queue()) {
             let alert = UIAlertView(title: "SQLiteDB", message:msg, delegate: nil, cancelButtonTitle: "OK")
             alert.show()
         }
     }
 }
 

iOS开发——数据持久化Swift篇&(三)SQLite3的更多相关文章

  1. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  2. iOS开发——数据持久化Swift篇&(二)沙盒文件

    沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...

  3. iOS开发——数据持久化Swift篇&(一)NSUserDefault

    NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...

  4. iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)

    文件目录路径获取(Home目录,文档目录,缓存目录等)   iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录:   1,Home ...

  5. iOS开发——数据持久化Swift篇&iCloud云存储

    iCloud云存储 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super. ...

  6. iOS开发——数据持久化Swift篇&SettingBundle

    SettingBundle import UIKit class ViewController: UIViewController { var userDefault = NSUserDefaults ...

  7. iOS开发——数据持久化Swift篇&(四)CoreData

    CoreData import CoreData class ViewController: UIViewController { override func viewDidLoad() { supe ...

  8. iOS开发——数据持久化Swift篇&通用文件存储

    通用文件存储 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...

  9. iOS开发——数据持久化Swift篇&模型对象归档

    模型对象归档 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...

随机推荐

  1. leetcode:Roman to Integer(罗马数字转化为罗马数字)

    Question: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the rang ...

  2. 使用Python拼接多张图片

    写机器学习相关博文,经常会碰到很多公式,而Latex正式编辑公式的利器.目前国内常用的博客系统,好像只有博客园支持,所以当初选择落户博客园.我现在基本都是用Latex写博文,然后要发表到博客园上与大家 ...

  3. EditText的几个小点

    1. EditText 由 TextView 继承而来 2. android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大的方便的操作.有时需要虚拟键盘 ...

  4. [Lua]入门教程

    什么是Lua Lua 是一个小巧的脚本语言.是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Rober ...

  5. 10个优质PSD文件资源下载

    很多设计需求并不一定要从头开始设计,你完全可以通过已有的灵感或素材开始设计任务.这个时候你可能需要一些PSD资源作为参考.今天我整理了一些常用的PSD资源供需要的朋友免费下载使用. Web & ...

  6. 全文索引之nutch与hadoop(转)

    原文:http://blog.csdn.net/chaofanwei/article/details/39476535 全文索引-lucene,solr,nutch,hadoop之lucene 全文索 ...

  7. cocos2d-x中有一个JniHelper类详细使用

    主体思路 通过JNI获取java虚拟机,再获取当前程序的JNI环境,通过JNI环境获取需要调用的java类信息,再获取需要调用的java类中的函数信息.再通过JNI环境调用,使用类信息.函数信息,调用 ...

  8. Netbeans Platform 工程,免安装JDK

    使用Netbeans 6.8 创建了一个Netbeans Platform 工程,以Zip形式发布后, 按照以下操作,可 以在客户端免安装JDK: 1. 从已安装JDK的计算机中,提取JDK:eg. ...

  9. 串口发送浮点型数据及int(2个字节)long int(4个字节)的方法

    方法一: 直接把float数据拆分为4个unsigned char(由于数字没法拆分,所以只能用指针的),发过去,在合并为float. 其中有两点要注意. (1)大端存储,小端存储:如果搞错读取数据就 ...

  10. enumerate

    enumerate 函数用于遍历序列中的元素并分配一个序号(序号默认从零开始 可以制定任意值): >>> for i,j in enumerate(('a','b','c')): p ...