配色: 字号:
SQLite的使用--SQLite语句
2016-09-10 | 阅:  转:  |  分享 
  
HYPERLINK"http://www.cnblogs.com/xiaotian666/p/5847185.html"SQLite的使用--SQLite语句
一.SQLite的介绍
?
1.为什么要存储数据?
?
???1.1手机数据大多都是从网络加载的,不存储,每次滚动界面都要从新发送网络请求加载数据,浪费流量
???1.2当用户没网的时候,就不能正常显示界面了
???1.3将数据存储到本地,不用每次加载,没网的时候也可从本地存储的数据拿来显示
?
2.存储数据的方式
??
?????Plist(NSArray\NSDictionary)
????????特点:只能存储系统自带的数据类型,比如NSDictory,NSArray等等.自定义的对象无法存储
?????Preference(偏好设置\NSUserDefaults)
????????特点:本质就是一个plist文件;也是只能存储系统自带的数据类型,自定义的对象无法存储
?????NSCoding(NSKeyedArchiver\NSkeyedUnarchiver)
特点:可以存储自己定义的数据类型,但是都是一次性的全数据操作
?????SQLite3
????????特点:存储一些大批量的数据,排序,统计等操作
?????CoreData
????????特点:对SQLite3的一层面向对象的包装,本质还是要转换成为对应的SQL语句去执行
?????在所有的存储方式中,SQLite速度最快,效率最高.
?
3.什么是SQLite?
SQLite是一款轻型的嵌入式关系数据库
它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了
目前广泛应用于移动设备中存储数据(Android/iOS)
处理数据的速度非常快,效率非常高
4.什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库(类似于excel表格)
数据库可以分为2大种类(了解)
关系型数据库(主流)
对象型数据库?
5.关系型数据库介绍
?
?
二.Navicat软件的破解
?
1.什么是Navicat?
???Navicat是数据库管理软件,支持大部分主流数据库(包括SQLite)(收费,要破解)
???可以通过图形化界面的方式来管理数据库
?
2.有破解版,可以去网上搜索下载,自己安装,这里不做介绍
?
三.Navicat软件的使用
?
1.创建SQLite数据库
?
?
?
2.创建表
???2.1双击打开数据库,在tables中点击右键,选中NewTable
???2.2创建表中对应的字段,点击”+”添加字段?
???2.3保存,要设置表格名称.名称规范:?t_名称如:t_student
?
?
3.设置主键,添加数据
???3.1什么是主键
?????主键就相当于身份证一样,用来区分每一条数据
?
?
???3.2设置主键注意点
?
?
???3.3添加,删除,修改数据
?????3.31直接点击”+”添加数据?
??????????注意:主键的值不要修改
?????3.32删除,选中一行,点击”-“直接删除?
????????注意:删除一组数据后,主键值就不会再被回收使用.一个主键值只对应一条数据,无论数据是否存在
?????3.33修改数据
????????双击想要修改的数据,直接修改?
?
四.SQLite的使用步骤
?
1.创建数据库(一个用于存储数据的文件)
???通常后缀名为:.db或.sqlite
?
2.创建表用于存储数据??
创建表时需要指定该表有哪些字段
比如学生表有:学号/姓名/年龄/身高等
3.对表进行增删改查操作
比如添加一条学生数据:型号:1/姓名:why/年龄:18/身高:1.88???
五.SQL简介
?
1.怎么在程序中使用SQLite?
???真实使用SQLite时用代码来操作的
?
2.怎么用代码操作SQLite?
???使用SQL语句来操作
?
3.SQL介绍?不做过多介绍,直接看下定义就行了
?
?
六.在代码中使用DDL(数据定义语句)
?
1.先导入libsqlite3.tba框架(c语言)
?
2.创建桥接文件,配置桥接文件(不会的话,看之前笔记)
?
3.创建数据库

//创建数据库
//文件路径:
//1.获取数据库的存放路径(沙盒中)
letfilePath="/Users/xiaomage/Desktop/123.sqlite"
letcString=filePath.cStringUsingEncoding(NSUTF8StringEncoding)!

//2.定义数据库对象(后面还要用,定义一个属性替代)
//vardb:COpaquePointer=nil

//3.打开/创建数据库对象
ifsqlite3_open(cString,&db)==SQLITE_OK{
print("创建/打开数据库成功")
}else{
print("失败")
}
}

4.创建表
???4.1创建SQL语句
???4.2执行语句(要对语句进行判断)?if?语句==SQLITE_OK?
???4.3创建表格式
???????CREATE?TABLE?IF?NOT?EXISTS?''表名''?(????''字段名''?类型(INTEGER,?REAL,?TEXT,?BLOB)????????NOT?NULL??不允许为空????????PRIMARY?KEY??主键????????AUTOINCREMENT?自增长,????''字段名2''?类型,????...
??)
???4.4语句说明???
CREATETABLE:创建一张表
IFNOTEXISTS:不存在则创建
''t_student'':表的名称
NOTNULL:不允许为空
PRIMARYKEY:主键
AUTOINCREMENT:自动增加
''id''INTEGER:有一个ID字段,类型是INTEGER

5.删除表
5.1删除表的格式
DROPTABLEIFEXISTS''表名'';

5.2语句说明
DROPTABLE:删除表
IFEXISTS:存在则删除
''表名'':要删除的表的名称

1//1.获取要执行的SQL语句
2letcreateTableSQL="DROPTABLEIFEXISTSt_student;"
3
4//2.执行语句
5ifsqlite3_exec(db,createTableSQL.cStringUsingEncoding(NSUTF8StringEncoding)!,nil,nil,nil)==SQLITE_OK{
6print("删除表成功")
7}else{
8print("删除表失败")
9}
10}


6.封装SQL语句
6.1创建/打开数据库的代码全部一样,可以封装起来
6.2创建语句,执行语句步骤都一样,只有语句的内容不一样,可以把语句当做参数,封装起来
6.3封装工具类,最好把实例对象设计为单例

classSQLiteManager{

//设计单例对象
staticletshareInstance:SQLiteManager=SQLiteManager()

//数据库对象
vardb:COpaquePointer=nil
}


//MARK:-打开数据库的操作
extensionSQLiteManager{
funcopenDB(filePath:String)->Bool{
//1.将Swift字符串转成C语言的字符串
letcString=filePath.cStringUsingEncoding(NSUTF8StringEncoding)!

//3.打开/创建数据库对象
returnsqlite3_open(cString,&db)==SQLITE_OK
}
}


//MARK:-执行SQL语句
extensionSQLiteManager{
funcexecSQL(sqlString:String)->Bool{
//1.将Swift字符串转成C语言的字符串
letcSQLString=sqlString.cStringUsingEncoding(NSUTF8StringEncoding)!

//2.执行语句
returnsqlite3_exec(db,cSQLString,nil,nil,nil)==SQLITE_OK
}
}


七.在代码中使用DML(数据操作语句)
?
1.插入数据
???1.1插入数据格式
INSERT?INTO?''t_student''?(name,?age,?height)?VALUES?(''why'',?18,?1.88);
???1.2语句说明
INSERTINTO:插入数据
''t_student'':在哪一个表中插入数据
(数据的字段):给哪些字段插入数据
VALUES(''why'',18,1.88):插入的具体值
?
//1.插入数据(获取插入语句)
letinsertSQL="INSERTINTOt_student(name,age,height)VALUES(''why'',18,1.88);"
//2.执行语句
SQLiteManager.shareInstance.execSQL(insertSQL)
?
2.更新数据
???1.1更新数据格式
UPDATE?''t_student''?SET?字段?=?''值''?WHERE?条件判断;
?
???1.2语句说明
UPDATE:跟新数据
''t_student'':在哪一个表中更新数据
SET字段=''值'':更新怎样的数据
WHERE条件判断:更新哪些数据
//1.获取更新语句
letupdateSQL="UPDATEt_studentSETname=''yz'';"
//2.执行语句
SQLiteManager.shareInstance.execSQL(updateSQL)
?
3.删除数据
???3.1删除数据格式
DELETE?FROM?t_student;
DELETE?FROM?t_student?WHERE?age??
???3.2语句说明
DELETEFROM:从表中删除数据
t_student:表名
可以跟条件也可以不跟:不跟表示删除所有的数据
//1.获取删除语句
letdeleteSQL="DELETEFROMt_student;"
//2.执行语句
SQLiteManager.shareInstance.execSQL(deleteSQL)
?
4.真实开发如何插入数据
???4.1真实开发插入数据,不可能一条一条去写
???4.2一般来说,我们开发都是面向模型的
???4.3可以把要插入的数据包装成模型
???4.4在模型中提供方法,快速插入数据
???4.5遍历模型数组,利用模型中快速插入数据的方法插入数据
?????
?
5.怎么把数据包装成模型?
???遍历数据,把数据的每一个字段作为模型的属性保存起来

//模拟从网络服务器中请求到很多数据(实际中数据是网络来的,这里自己写模拟)
for_in0..<100{
letname="zs\(arc4random_uniform(100))"
letage=Int(10+arc4random_uniform(10))
letheight=1+Double(arc4random_uniform(10))/10.0

letstu=Student(name:name,age:age,height:height)

stus.append(stu)
}


模型中代码:

1classStudent:NSObject{
2varname:String=""
3varage:Int=0
4varheight:Double=0.0
5
6init(name:String,age:Int,height:Double){
7self.name=name
8self.age=age
9self.height=height
10}
11}
12
13extensionStudent{
14funcinsertDB(){
15//1.插入数据(获取插入语句)
16letinsertSQL="INSERTINTOt_student(name,age,height)VALUES(''\(name)'',\(age),\(height));"
17//2.执行语句
18SQLiteManager.shareInstance.execSQL(insertSQL)
19}
20}


控制器中快速插入
forstuinstus{
stu.insertDB()
}

6.插入数据的优化
6.1如果有大量数据插入,在主线程执行,会阻塞ui
6.2插入大量数据怎么优化?
6.21在子线程进行数据插入
6.22手动开启事务
如果一条条数据进行插入时,那么每插入一条数据就会开启一次事务.(开启事务耗时)
但是如果有明确的开启事务,那么系统就不会在插入每条数据时,再开启事务

1dispatch_async(dispatch_get_global_queue(0,0)){
2//获取插入数据开始时间
3letstartTime=CACurrentMediaTime()
4//开启事务
5letstartSQL="BEGINTRANSACTION;"
6SQLiteManager.shareInstance.execSQL(startSQL)
7
8forstuinself.stus{
9stu.insertDB()
10}
11//关闭事务
12letcommitSQL="COMMITTRANSACTION;"
13SQLiteManager.shareInstance.execSQL(commitSQL)
14//获取插入数据结束时间
15letendTime=CACurrentMediaTime(www.hunanwang.net)
16//获取插入数据耗时
17print(endTime-startTime)
18}
19}

?
八.在代码中使用DQL(数据查询语句)
?
1.查询语句
??
?
2.查询数据代码实现步骤
???2.1获取查询语句
???2.2执行查询语句(得到的结果保存到数组中,最好是字典数组)
???2.3遍历数组,字典转模型
???2.4从模型中读取数据
?
代码实现:

1//1.获取查询语句
2letquerySQL="SELECTFROMt_studentLIMIT30,30;";
3
4//2.执行语句(执行语句封装到了一个方法里面)
5guardletdictArray=SQLiteManager.shareInstance.querySQL(querySQL)else{
6return
7}
8
9//3.遍历数组
10vartempArray=[Student]()
11fordictindictArray{
12//字典转模型
13tempArray.append(Student(dict:dict))
14}
15
16forstuintempArray{
17print(stu.name,stu.age)
18}
19
20//执行语句代码实现
21funcquerySQL(querySQL:String)->[[String:NSObject]]?{
22//0.将Swift字符串转成C语言字符串
23letcString=querySQL.cStringUsingEncoding(NSUTF8StringEncoding)!
24
25//1.定义游标(指针)
26varstmt:COpaquePointer=nil
27
28//2.给游标赋值
29//1>参数一:数据库对象
30//2>参数二:SQL语句
31//3>参数三:该SQL语句的长度-1-->系统自动计算
32//4>参数四:游标的地址
33guardsqlite3_prepare_v2(db,cString,-1,&stmt,nil)==SQLITE_OKelse{
34returnnil
35}
36
37//3.取出所有的数据
38//3.1.定义字典数组
39vardictArray=[[String:NSObject]]()
40
41//3.2.判断是否有该条数据
42whilesqlite3_step(stmt)==SQLITE_ROW{
43//3.3.获取字段的个数
44letcount=sqlite3_column_count(stmt)
45//3.4.定义字典
46vardict=[String:NSObject](www.visa158.com)
47//3.5.遍历每一个字典
48foriin0..49//3.6.取出该列的键
50letckey=sqlite3_column_name(stmt,i)
51guardletkey=String(UTF8String:ckey)else{
52continue
53}
54//3.7.取出该列的值
55letcvalue=UnsafePointer(sqlite3_column_text(stmt,i))
56//将c语言字符串转成swift字符串
57letvalue=String(UTF8String:cvalue)
58
59//3.8.将键值对放入到字典中
60dict[key]=value
61}
62//3.9.将字典放入到数组中
63dictArray.append(dict)
64}
65returndictArray
66}
67}


九.FMDB框架的使用

1.FMDB框架的作用?
FMDB是用来简化操作数据库的框架

2.FDMB的基本使用
2.1创建数据库

privatelazyvardb:FMDatabase=FMDatabase(path:"/Users/lgp/Desktop/321.sqlite")
//创建FMDatabase对象
//打开/创建数据
ifdb.open(){
print("打开成功")
}else{
print("失败")
}


2.2创建/删除表插入/更新/删除数据
本质都是一样的只有语句的内容不一样
将语句内容换成对应的操作,就能执行该项操作(和SQLite语句一样)

//1.获取创建表的语句
letcreateSQL="INSERTINTOt_person(name,age,height)VALUES(''why'',18,1.88);"
//2.执行语句
db.executeUpdate(createSQL,withArgumentsInArray:nil)

2.3查询数据
vardb:FMDatabase?


1funcquerySQL(querySQL:String)->[[String:NSObject]]?{
2//0.判断db是否有值db定义为属性
3guardletdb=dbelse{
4returnnil
5}
6//1.执行查询语句结果为集合
7letresults=db.executeQuery(querySQL,withArgumentsInArray:nil)
8
9//2.获取数据
10//2.0.定义数据
11vardictArray=[[String:NSObject]]()
12
13//2.1.判断结果集中是否有内容
14whileresults.next(){
15
16letcount=results.columnCount()
17
18vardict=[String:NSObject]()
19
20foriin0..21letkey=results.columnNameForIndex(i)
22letvalue=results.stringForColumnIndex(i)
23
24dict[key]=value
25}
26dictArray.append(dict)
27}
28returndictArray
29}
献花(0)
+1
(本文系白狐一梦首藏)