IOS DB技术方案对比

IOS DB技术方案对比

1. IOS 使用DB存储的方式

  • IOS 目前主流使用DB的方式有:

      1. 直接使用Sqlite3 框架:
      1. 使用FMDB框架:
      1. 使用CoreData:
      1. 使用WCDB.swift框架:
      1. 使用SQLite.swift
  • 几种DB处理方式简介

1. 1 直接使用Sqlite3 框架

SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。SQLite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库
一个数据库中的表就算是一个文件,一般是将这个文件放在沙盒Document目录下,文件后缀名一般为db(database)

  • 缺点

1.使用麻烦:在Swift下使用SQLite很是麻烦(当然OC下也是挺麻烦的),苹果官方文档中,要使用原生的SQLite,要先导入framwork,然后建一个.h文件,还要做一次Swift与C语言的桥接(SQLite是基于C语言的),使用的时候还要写SQL语句.

  • sqlite中支持的数据类型:
数据类型表达式 标识类型
smallint 短整型
integer 整型
real 实数型
float 单精度浮点
double 双精度浮点
currency 长整型
varchar 字符型
text 字符串
binary 二进制数据
blob 二进制大对象
boolean 布尔类型
date 日期类型
time 时间类型
timestamp 时间戳类型
  • 修饰条件
数据类型表达式 解释
PRIMARY KEY 将本参数这个为主键,主键的值必须唯一,可以作为数据的索引,例如编号。
NOT NULL 标记本参数为非空属性。
UNIQUE 标记本参数的键值唯一,类似主键。
DEFAULT 设置本参数的默认值
CHECK 参数检查条件,例如上面代码,写入数据是count必须大于时才有效。

1. 2 使用FMDB框架:

  • 什么是FMDB

FMDB是基于OC语言对SQlite数据库使用的封装,具有对象化概念(注意这里的对象化概念不是说可以直接存储对象,是指OC语言的基本对象【NSInteger(integer)、浮点型(real)、NSString (text) 、 对象或其他(blol)】,实际数据库存储的类型只有小括号内的四中基本的。对于图片等其他类型的可以转化为二进制存储在数据库中。

  • 基本使用
// 删除数据表

if (![database executeUpdate:@"delete from contactLists"]) {
//【learn:以下语句无法删除】drop contactList if exsists
}

//插入
NSString *insertSql = [NSString stringWithFormat:@"insert into contactLists(userName,sign,age) values('%@','%@','%d')",name,@"签名",18];//[注意:这里必须指定值类型需,不可以在values中使用?会出错]

//在executeUpdate后面直接加sql语法时,使用?来表示OC中的对象,integer对应NSNumber,text对应NSString,blob对应NSData,数据内部转换FMDB已经完成,只要sql语法正确就没有问题
    if (![database executeUpdate:@"insert into person (id, name, sex, telephone) values (?, ?, ?, ?)", @4, @"gary", @"male", @"99996666"])





1. 3

1. 4

1. 5 使用SQLite.swift

//: Playground - noun: a place where people can play
//使用SQLite之前记得要添加在工程属性Build Phases 选项,增加SQLite iOS到Target Dependencies中
//用于介绍SQlite.swift的基本使用地址https://github.com/stephencelis/SQLite.swift
//详细使用地址:https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#sqliteswift-documentation
 
import SQLite
 
//**链接数据库
let db = try Connection("path/to/db.sqlite3")//与数据库连接(重点)
 
//**定义表属性
let users = Table("users")                   //创建数据表名字
let id = Expression<Int64>("id")            //定义表属性
let name = Expression<String?>("name")
let email = Expression<String>("email")
 
//**建表
try db.run(users.create { t in              //创建表只需要产生一次,多次运行会报错
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
    })
// CREATE TABLE "users" (
//     "id" INTEGER PRIMARY KEY NOT NULL,
//     "name" TEXT,
//     "email" TEXT NOT NULL UNIQUE
// )
 
//*插入
let insert = users.insert(name <- "Alice", email <- "alice@mac.com")  //插入的信息
let rowid = try db.run(insert)//返回插入的id                            //执行插入
// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com')
 
for user in try db.prepare(users) {                       //采用循环式使用(.prepare:表示准备执行某表某操作)//返回表行
    print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
    // id: 1, name: Optional("Alice"), email: alice@mac.com
}
 
 
//*选择
// SELECT * FROM "users"
 
let alice = users.filter(id == rowid) //[filter:过滤]     //查询(返回一个表不是行,无法直接输出)可以像操作数据表一样操作它(并且会同步到初始表)如果失败了,表的数量为0呗(db.scalar(alice.count) //0)
 
 
//*更新
try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))//执行更新
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') //这里还是部分更新
// WHERE ("id" = 1)
 
 
 
 
//*删除
try db.run(alice.delete())                                           //执行删除
// DELETE FROM "users" WHERE ("id" = 1)
 
db.scalar(users.count) // 0    //【scalar:数量】                      //统计数据行数
// SELECT count(*) FROM "users"
 
 ////建议,实际使用,将部分代码(如建表)分开到另外的地方,将一些其他的数据变量化
 
 /// SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C API.
 
//可以直接执行语句????
let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)")
for email in ["betty@icloud.com", "cathy@icloud.com"] {
    try stmt.run(email)
}
 
db.totalChanges    // 3
db.changes         // 1
db.lastInsertRowid // 3
 
for row in try db.prepare("SELECT id, email FROM users") {
    print("id: \(row[0]), email: \(row[1])")//用下标代替列
    // id: Optional(2), email: Optional("betty@icloud.com")
    // id: Optional(3), email: Optional("cathy@icloud.com")
}
 
db.scalar("SELECT count(*) FROM users") // 2


上一篇:FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中


下一篇:FMDB数据库的简单使用、VIewController的生命周期、关于导航栏的一些知识