SQLite在iOS中的使用
SQLite,是一款轻型的数据库。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,目前最新的版本是Sqlite3。
先给大家介绍几个概念。
记录:我们通常把表中能表达一条完整的信息叫做一个“记录”,可以对应Model的一个对象。<br >
字段:在数据库中,大多数时,表的“列”称为“字段” ,每个字段包含某一专题的信息。对应着Model类中的属性。<br >
主键(primary key):是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录。主关键字是一种唯一关键字,表定义的一部分。一个表不能有多个主关键字,并且主关键字的列不能包含空值。主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义。<br >
外键(Foreign Key):在本表A中是主键,在另外一张表中不是主键,而是普通的字段,那个这个字段可以称之为表A的外键
sqlite中常用到的类型
NULL. 值是空值。
INTEGER. 值是有符号整数,根据值的大小以1,2,3,4,6 或8字节存储。
REAL. 值是浮点数,以8字节 IEEE 浮点数存储。
TEXT. 值是文本字符串,使用数据库编码(UTF-8, UTF-16BE 或 UTF-16LE)进行存储。
BLOB. 二进制数据类型。
常见的sqlite的增、删、改、查常用操作
1.创建表
CREATE TABLE IF NOT EXISTS UserTable (username TEXT primary key,password TEXT,email TEXT);
2.插入一条数据
INSERT OR REPLACE INTO UserTable (username , password,email) VALUES (?,?,?);
3.更新一条数据
UPDATE UserTable set password = '123456' where username = 'wxhl';
4.查询数据
SELECT username,password,email FROM UserTable where username = 'wxhl'
5.删除数据
DELETE FROM UserTable WHERE username='wxhl'
6.模糊查询
SELECT *FROM UserTable Where username is LIKE "侯%"
7.倒叙排列(默认正)
SELECT *FROM UserTable ORDER BY sage DESC
看看在iOS工程中的使用 Model类的封装 <code>
// Created by 侯垒 on 16/1/29.
// Copyright (c) 2012年 Se7eN_HOU. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StudnetModel : NSObject
@property(nonatomic)int ID;
@property(nonatomic)int age;
@property(strong,nonatomic)NSString *phone;
@property(strong,nonatomic)NSString *name;
@property(strong,nonatomic)NSData *data;
-(id)initWithName:(NSString *)name andAge:(int)age andId:(int)ID andAddres:(NSString *)phone andPhoto:(NSData *)imageData;
@end
</code>
数据库工具类的封装<code>
//
// Created by 侯垒 on 16/1/29.
// Copyright (c) 2016年 Se7eN_HOU. All rights reserved.
//
# import <Foundation/Foundation.h>
# import <sqlite3.h>//系统内嵌数据库文件
# import "StudnetModel.h"//导入model类<br >
@interface DataBaseManager : NSObject<br >
+(sqlite3 *)openDB;//打开数据库操作
+(void)closeDB;//关闭数据库的操作
//向数据库里面添加一个记录
+(BOOL)addStudent:(StudnetModel *)stu;
//根据条件修改一个记录的值
+(BOOL)updateStuentName:(NSString *)name andAge:(int)age andPhone:(NSString *)phone whereIDIsEqual:(int)ID;
//查找全部
+(NSMutableArray *)findAll;
//根据ID删除一条记录
+(BOOL)deleteByID:(int)ID;
@end
</code>
打开数据库的方法 <code>
+(sqlite3 *)openDB
{
if (db)
{
//能进到该if语句数据数据库对象已经创建过了,只要直接把原来创建的数据库对象直接返回出去就行
return db;
}
//没有创建数据库的时候,就要先创建数据库//1、找到数据库文件要存放的路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
//2、在该路径下创建一个数据库文件的路径
NSString *filePath=[docPath stringByAppendingPathComponent:@"StudentDB.sqlite"];
NSLog(@"filePath=%@",filePath);
//3、在该数据库路径下创建一个数据库文件
/*
//因为sqlite用的是C级别语言,所以这里需要将OC的语法都转化为C的语法,
//参数一:数据库的路径,并且要转化成C的路径
//参数二:你要操作那个数据库对象
//这一行代码就是告诉编译器,以后我都用db这个指针来操作硬盘里面的数据库文件
*/
int state=sqlite3_open([filePath UTF8String], &db);
if (state!=SQLITE_OK)
{
NSLog(@"数据库打开失败");
return nil;
}
//4、创建一个表,用来存放数据(SQL语句)
NSString *createTableStr=@"create table if not exists classA(ID integer primary key,name text,phone text,age integer,photo BLOB)";
//sqlite3_exec:数据库使用的函数
//参数一:你要使用的是哪一个数据库
//参数二:你要对数据库做什么操作(创建表,增,删,改,查)
//参数三,四:系统预留参数
//参数五:错误信息,指针的指针,填写地址
char *errmsg;
if (sqlite3_exec(db,[createTableStr UTF8String], NULL, NULL, &errmsg))
{
//能进到该if语句里面,说明操作成功
sqlite3_close(db);//关闭数据库
sqlite3_free(errmsg);//释放指针;
}
//把创建好的表返回出去
return db;
}
</code>
关闭数据库<code>
+(void)closeDB
{
if (db)
{
sqlite3_close(db);
}
}
</code>
向数据库中添加数据<code>
#pragma mark- 添加
+(BOOL)addStudent:(StudnetModel *)stu
{ //1、打开数据库
sqlite3 *db=[DataBaseManager openDB];
//2、创建一个数据库管理员
sqlite3_stmt *stmt=nil;
//3、准备添加的sql语句
//准备执行的语句
//参数一:准备对哪一个数据库操作
//参数二:sql语句 ?是展位符
//参数三:-1:(自动计算长度)
//参数四:用谁去操作数据
//参数五:系统预留参数
int state= sqlite3_prepare_v2(db,"insert into classA(name,phone,age,photo) values(?,?,?,?)" , -1, &stmt, nil);
if (state==SQLITE_OK)
{
//参数1:用仓库管理员去操作数据的写入
//参数2:对哪一个?(字段)进行赋值
//参数3:写入数据库的具体的值
//参数4:-1
//参数5:系统预留参数
//对?进行具体的赋值
sqlite3_bind_text(stmt, 1, [stu.name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2, [stu.phone UTF8String], -1, nil);
sqlite3_bind_int(stmt, 3, stu.age);
sqlite3_bind_blob(stmt, 4, stu.data.bytes, stu.data.length, nil);
//一步一步去执行的方法
int result= sqlite3_step(stmt);
if (result==SQLITE_DONE)
{
//SQLITE_DONE = sqlite3_step() has finished executing
//进到该if语句说明添加成功
return YES;
}
}
return NO;
}
</code>
修改数据<code>
#pragma -mark更改
+(BOOL)updateStuentName:(NSString *)name andAge:(int)age andPhone:(NSString *)phone whereIDIsEqual:(int)ID
{
//1、打开数据库
sqlite3 *db=[DataBaseManager openDB];
//2、创建数据的管理员
sqlite3_stmt *stmt=nil;
//3、准备修改的SQL语句
int result=sqlite3_prepare_v2(db,"update classA set name = ?,phone = ?,age =? where ID = ?", -1, &stmt, nil);
//4、如果sql语句没有错误,进行具体的赋值
if (result==SQLITE_OK)
{
//对问号的赋值
sqlite3_bind_text(stmt, 1,[name UTF8String], -1, nil);
sqlite3_bind_text(stmt, 2,[phone UTF8String], -1, nil);
sqlite3_bind_int(stmt, 3, age);
sqlite3_bind_int(stmt, 4, ID);
int state = sqlite3_step(stmt);
if (state==SQLITE_DONE)
{
return YES;
}
}
return NO;
}
</code>
查询数据<code>
#pragma mark- 查找全部
+(NSMutableArray *)findAll
{
//1
sqlite3 *db=[DataBaseManager openDB];
//2
sqlite3_stmt *stmt=nil;
//3
int result=sqlite3_prepare_v2(db,"select * from classA", -1, &stmt, nil);
//4
NSMutableArray *allStudentArray=[[NSMutableArray alloc] init];
if (result==SQLITE_OK)
{
//开始搜索
//SQLITE_ROW= sqlite3_step() has another row ready
//SQLITE_ROW只要数据库里面还有下一行,就会自动循环
while (SQLITE_ROW==sqlite3_step(stmt))
{
//sqlite3_column_int从数据库里面读取数据的方法
int ID=sqlite3_column_int(stmt, 0);
const unsigned char *name=sqlite3_column_text(stmt, 1);
const unsigned char *phone=sqlite3_column_text(stmt, 2);
int age=sqlite3_column_int(stmt, 3);
const void *bytes = sqlite3_column_blob(stmt, 4);
int length = sqlite3_column_bytes(stmt, 4);
NSData *data = [NSData dataWithBytes:bytes length:length];
//将从数据库里面读取出来的C语言级别数据转化为OC的类型的数据再赋值给Model类
StudnetModel *student=[[StudnetModel alloc] init];
student.ID=ID;
student.name=[NSString stringWithUTF8String:(char *)name];
student.phone=[NSString stringWithUTF8String:(char *)phone];
student.age=age;
student.data = data;
[allStudentArray addObject:student];
}
}
return allStudentArray;
}
</code>
删除数据<code>
+(BOOL)deleteByID:(int)ID
{
sqlite3 *db=[DataBaseManager openDB];
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(db,"delete from classA where ID = ?", -1, &stmt, nil);
if (result==SQLITE_OK)
{
sqlite3_bind_int(stmt, 1, ID);
int state=sqlite3_step(stmt);
if (state==SQLITE_DONE)
{
return YES;
}
}
return NO;
}
</code>