objective-c - 基础篇 - 数据库网络 - sqlite的链接+增删改查
2016-05-15 10:14
567 查看
一、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 =
4000
"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
注: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 =
4000
"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
相关文章推荐
- Android QQ第三方登录及加载网络图片到本地
- ActiveXObject( "Microsoft.XMLHTTP ")解析
- 1.5、ServletRequestAttributeListener和HttpSessionAttributeListener监听器范例
- HttpServletRequest获取URL get变量
- TCP/IP知识点
- 基于DHT网络的最强BT资源搜索引擎engiy.com
- 【网络爬虫】爬取糗事百科段子
- iOS9 请求出现App Transport Security has blocked a cleartext HTTP (http://)
- 深入理解Nginx第四章:HTTP配置项的步骤整理
- Java网络通信示例
- IOS企业App应用的安装及https证书生成
- 第十八章网络编程
- 关于HTTP 协议的特点,以及网络请求GET 和 POST 的区别?
- WEB服务器、应用程序服务器、HTTP服务器有何区别?
- Windows网络编程学习笔记(5) TCP服务端向客户端发送Hello World!
- HTTP协议三次握手过程
- 网络多线程01
- 为什么基于TCP的应用需要心跳包(TCP keep-alive原理分析)
- 通过对日志配置文件的修改,使得本地的日志同步给另一台PC(这两台PC在同一网络下)
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活