一、sqlite的链接+增删改查(XCODE7.1+ IOS9)
注:sqlite数据库的链接+增删改查中需要注意的地方有:
大前提:需要导入数据库 库。点击项目 》》BuildPhases 》》Link Binary With Libraies 》》点击+号》》Add Other..》》按 shift+command+G 》》输入//usr//lib》》选择 libsqlite3.dylib 》》之后在 文件里加上
#import<sqlite3.h>这样才可以访问到sql语句。
一:要访问数据库,前提是获得项目的路径。获得之后就是在路径下使用
stringByAppendingPathComponent添加一个数据库文件。
二:数据库的操作流程是:1:打开数据库。 2:操作数据库。 3:关闭数据库。
三:打开数据库:1:定义一个起着标示作用的sqlite3对象指针。 2:使用sqlite3_open打开数据库,这里需要注意的 一点是:int result =sqlite3_open(filePath.UTF8String, &db);//&db 是指针, 需要把filePath转为C 语言的 CAHR。3:使用 result == SQLITE_OK来判断是否打开成功。
四:操作数据库:1:创建表 2:增 3:删 4:改 5:查
五:创建表:1:char * sql ="create table if not exists t_student(name text, age integer)"; 这里必须使用 if not exists来判断数据库中是否已经存在该表。2:使用result =sqlite3_exec(db, sql,NULL,NULL, &err);来执行语句。
六:增删改查:都有三种书写数据库操作语句的方法。这里用增来举例。其他大同小异。
1:固态的增加语句:char * addsql = "insert into t_student(name, age) values('张三', 22)";
2:拼接的语句:NSString * addsql = [NSString stringWithFormat:@"insert into t_student(name, age) values('%@', %@)", name, age];
3:使用层数的语句:
sqlite3_stmt * addstmt; //定义一个二维表格
char * addsql ="insert into t_student(name, age) values(?, ?)"; //使用 ?占位符
result = sqlite3_prepare_v2(db,addsql, -1, &addstmt,NULL); //使用sqlite3_prepare_v2这个预处理语句
if (result ==SQLITE_OK) {
//绑定参数
int nameresult =sqlite3_bind_text(addstmt, 1, [name UTF8String], -1,NULL); //这里的1就是代表addsql语 句中的第一个问号.并且需要把name转为C语言的CHAR
if (nameresult ==SQLITE_OK) {
NSLog(@"name绑定成功");
}
int ageresult =sqlite3_bind_int(addstmt, 2, [age intValue]); //这里的1 就是代表addsql语句中的第一个问号.
if (ageresult ==SQLITE_OK) {
NSLog(@"age绑定成功");
}
}
if (sqlite3_step(addstmt) !=SQLITE_DONE) {
NSLog(@"插入失败");
}
sqlite3_finalize(addstmt); //最后是释放层数所占用的资源。
七:关闭数据库
sqlite3_close(db);
八:代码
#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)db:(id)sender {
// //获得项目路径
// NSString * path = NSHomeDirectory();
// //往路径增加文件名
// path = [path stringByAppendingPathComponent:@"mydb1.sqlite"];
// NSLog(@"%@", path);
//
//
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//获得文档文件夹下的第一个元素,就是文档的路径(相当于访问NSHomeDirectory()下的Documents文件路径)---------即获取到Documents的完整路径
NSString * documentDirectory = [paths objectAtIndex:0];
/*-------开始写入内容到文件夹中-----------*/
//1:就是在上面的文档路径下添加一个txt文件,注意使用的是stringByAppendingPathComponent,加的是一个路径。而不是stringByAppendingString,是因为这样就有路径的分隔符
NSString * filePath = [documentDirectory stringByAppendingPathComponent:@"mydb2.sqlite"];
NSLog(@"%@", filePath);
sqlite3 * db; //数据库指针--其实起着标示作用。
//打开数据库,如果没有数据库,就创建数据库文件,并且打开。如果已经存在该数据库,就直接打开数据库。
int result = sqlite3_open(filePath.UTF8String, &db); //&db 是指针
//判断打开是否成功
if (result != SQLITE_OK) {
NSLog(@"打开错误");
}
//操作数据库
char * sql = "create table if not exists t_student(name text, age integer)";
char * err;//保存错误信息
result = sqlite3_exec(db, sql, NULL, NULL, &err);
//判断创建是否成功
if (result == SQLITE_OK) {
NSLog(@"创建成功");
}
//获得文本框内容
NSString * name = self.name.text;
NSString * age = self.age.text;
//增
/*方法一:普通方法
char * addsql = "insert into t_student(name, age) values('张三', 22)"; //固态的增加语句
NSString * addsql = [NSString stringWithFormat:@"insert into t_student(name, age) values('%@', %@)", name, age];
NSLog(@"%s", addsql);
result = sqlite3_exec(db, addsql, NULL, NULL, &err);
//判断创建是否成功
if (result != SQLITE_OK) {
NSLog(@"错误原因%s", err);
}
*/
//方法二:使用层数的方法
sqlite3_stmt * addstmt;
char * addsql = "insert into t_student(name, age) values(?, ?)";
result = sqlite3_prepare_v2(db,addsql, -1, &addstmt, NULL);
BOOL bflot = NO; //标示
if (result == SQLITE_OK) {
//绑定NAME参数
int nameresult = sqlite3_bind_text(addstmt, 1, [name UTF8String], -1, NULL); //这里的1 就是代表addsql语句中的第一个问号.
if (nameresult != SQLITE_OK) {
NSLog(@"name绑定失败");
bflot = YES;
}
//绑定AGE参数
int ageresult = sqlite3_bind_int(addstmt, 2, [age intValue]); //这里的2 就是代表addsql语句中的第二个问号.
if (ageresult != SQLITE_OK) {
NSLog(@"age绑定失败");
bflot = YES;
}
}
if (bflot == NO) { //绑定成功的时候才执行下面语句。
if (sqlite3_step(addstmt) != SQLITE_DONE) {
NSLog(@"插入失败");
}
}
sqlite3_finalize(addstmt);
//删
/*
方法一:普通方法
char * deletesql = "delete from t_student where name='张三'"; //固态的增加语句
NSLog(@"%s", deletesql);
result = sqlite3_exec(db, deletesql, NULL, NULL, &err);
//判断创建是否成功
if (result != SQLITE_OK) {
NSLog(@"错误原因%s", err);
}*/
//方法二:使用层数的方法
sqlite3_stmt * deletestmt;
char * deletesql = "delete from t_student where name=?";
result = sqlite3_prepare_v2(db,deletesql, -1, &deletestmt, NULL);
//预处理
if (result == SQLITE_OK) {
//绑定参数
int nameresult = sqlite3_bind_text(deletestmt, 1, "来了四", -1, NULL); //这里的1 就是代表addsql语句中的第一个问号.直接使用“张三”,不需要再加@了。因为这样就直接是 C语言的语法。并且 也不用再加 单引号
if (nameresult != SQLITE_OK) {
NSLog(@"name绑定失败");
}
else //绑定成功就可以执行语句
{
if (sqlite3_step(deletestmt) != SQLITE_DONE) {
NSLog(@"删除失败");
}
}
}
else{
NSLog(@"绑定失败");
}
//释放
sqlite3_finalize(deletestmt);
//改
/*
方法一:普通方法
char * updatesql = "update t_student set age=25 where name='来了四'"; //固态的增加语句
NSLog(@"%s", updatesql);
result = sqlite3_exec(db, updatesql, NULL, NULL, &err);
//判断创建是否成功
if (result != SQLITE_OK) {
NSLog(@"错误原因%s", err);
}
*/
//方法二:使用层数的方法
//1:先定义一个二维表格的层数
sqlite3_stmt * updatestmt;
char * updatesql = "update t_student set age=? where name=?"; //固态的增加语句
result = sqlite3_prepare_v2(db, updatesql, -1, &updatestmt, NULL);
BOOL aFlot = NO; //标示
if (result == SQLITE_OK) {
//绑定AGE参数
int ageresult = sqlite3_bind_int(updatestmt, 1, 8888); //这里的1 就是代表addsql语句中的第一个问号.
if (ageresult != SQLITE_OK) {
NSLog(@"age绑定失败");
bflot = YES;
}
//绑定NAME参数
int nameresult = sqlite3_bind_text(updatestmt, 2, "gh", -1, NULL); //这里的2 就是代表addsql语句中的第二个问号.
if (nameresult != SQLITE_OK) {
NSLog(@"name绑定失败");
bflot = YES;
}
if (bflot == NO) { //绑定成功的时候才执行下面语句。
if (sqlite3_step(updatestmt) != SQLITE_DONE) {
NSLog(@"更新失败");
}
}
}
else{
NSLog(@"预处理失败");
}
sqlite3_finalize(updatestmt);
//查 -- 这里使用预处理语句--sqlite3_prepare_v2 是为了找到缓存中运行过的sql语句,增加SQL语句编译的效率
//1:先定义一个二维表格的层数
sqlite3_stmt * searchstmt;
char * searchsql = "select * from t_student";
//2:执行预处理语句。 int nByte 也就是下面的这个 -1 是代表有多少个字节。这里的-1就是让电脑自己计算.下面的 &stmt 是代表返回的内容格式
result = sqlite3_prepare_v2(db, searchsql, -1, &searchstmt, NULL); //这里是预处理语句
if (result == SQLITE_OK) { //判断创建是否成功
//3:先遍历返回的结构
while (sqlite3_step(searchstmt) == SQLITE_ROW) { //得到返回结构的一行
//4:得到预处理结果。 这里做了一个强制转换,转成char *。 之后这里的0 代表的是第一列,而且第一列是text类型的。
char * name = (char *)sqlite3_column_text(searchstmt, 0);
int age = sqlite3_column_int(searchstmt, 1); //这里的1 代表的是第二列,而且第一列是int类型的。
//5:把C语言的char转成 NSString
NSString * strname = [NSString stringWithUTF8String: name]; //这里是把 char 的name 转换成 NSString
NSLog(@"name = %@, age = %d", strname, age);
}
}
else{
NSLog(@"预处理失败");
}
//6:释放层数所占用的资源。
sqlite3_finalize(searchstmt);
//关闭数据库
sqlite3_close(db);
}
@end