//
// ViewController.m
// 数据持久化和数据库
//
// Created by熊永静 on 16/1/4.
// Copyright © 2016年静. All rights reserved.
//
/*
数据库sqlite
sqlite3
数据持久化的一种
plist NSUserDefaults 归档 sqlite
sqlite
关系型数据库,以表格的形式存储
在sqlite中类似表格的表头的位置是字段(字段是用来查找数据的关键字《每张表格的关键字,不能重名》)
可以通过这张表格任意一个字段,查找到对应的那条数据
sqlite中可以有多个表,表与表之间是通过主键和外键关联起来的
sqlite最上面横向的是字段名,字段名不能重复(同一张表)
查找某条数据的关键字
在字段的下面是每一条数据(存储的内容)
sqlite中可以有多张表表关联 ->主键外键
--------------------------------------------
操作数据库
1、sql(structured query language)结构化查询语言
sql语句->结构化查询语言组成的一条语句
2、操作数据库的函数(C语言)
①sql语句
常用关键字:select、insert、update、delete、from、create、where、desc、order、by、group、table、drop、view、index等等
功能性:建表、删表
操作类:增、删、改、查
建表:create table
删表:drop table
建表的公式:create table表名 (字段名类型,字段名 类型);
删表公式:drop table表名
// 如果不存在这个表,就去创建(if not exists)
create table if not exists 表名 (字段名类型,字段名 类型)
// 例子
create table if not exists user (name text, age integer)
让ID自动增长把某个字段设置成主键,并让他自动增长
create table if not exists user (id integer primary key autoincrement, name text, age integer)
integer: 整型值
real: 浮点值
text: 文本字符串
blob: 二进制数据
删表公式:drop table表名
drop table user
// 如果User存在就删除
drop table if exists user
-----------------------------------------
操作数据
增删改查
增:inster into values
inster into 表名(字段名) values(值)
删:delete from
delete from 表名 where 字段 = '值';
改:updata form where set
// 将哪一个字段的值改成一个新的值
update 表名 set 字段名 = '新值' where字段名 = '值';
查:select from where
// 查询某一数据数据
select 字段(整条数据所包含的字段) from 表名 where 字段 like ?;
// 查询整个表
select from 表名 *
-----------------------------------------
iOS中操作数据库的函数
1、在使用数据库之前需要导入sqlite3
2、打开数据库和关闭数据库:
sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)打开数据库
sqlite3_close(<#sqlite3 *#>)关闭数据库
3、(如果没有建表,需要建表)增删改对应的操作
查对应的操作 关闭数据库
对表格进行操作:
sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
查询:
1、核对sql语句的合法性
sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
2、绑定要查询的数据
sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int#>, <#void (*)(void *)#>)
3、开始查询
sqlite3_column_text(<#sqlite3_stmt *#>, <#int iCol#>)
使用完毕数据库,及时关闭数据库
*/
#import"ViewController.h"
#import <sqlite3.h>
@interfaceViewController ()<UITextFieldDelegate>
{
sqlite3 *db;
UIView *baview;
}
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
// 打开数据库
// (1)数据库的文件路径
// (2)打开数据库
// 创建一个叫课件的数据库 课件.sqlite
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *path = [[pathList lastObject]stringByAppendingPathComponent:@"课件.sqlite"];
// [path UTF8String];直接转换成char *类型
// 需要两个值:1、文件路径2、数据库对象的内存地址
// sqlite3_open返回值是int类型,可以通过系统定义的一个宏定义来判断是否打开成功
if (sqlite3_open([pathUTF8String], &db) != SQLITE_OK) {
NSLog(@"打开数据库失败");
sqlite3_close(db);//关闭数据库
}
else{
NSLog(@"%@",path);
}
//建表
// 需要传的对象
// 1、数据库对象
// 2、sql语句
// 3、4、NULL
// 5、传一个char *类型的字符串如果有错误,会返回一个错误信息
// char *error;
// sqlite3_exec(db, [@"建表(添加、修改、删除)的语句" UTF8String], NULL, NULL, &error);
/*
在操作数据库的时候删除或者添加字段都需要将原来的数据库删除再去运行,否则回崩溃。
*/
// 在""内使用字符串使用''
// [self addName:@"肖耐" age:18];
// [self addName:@"许弋" age:18];
// 改
// sqlite3_exec(db, [@"update user set name = '豆豆' where name = '小明';"UTF8String], NULL, NULL, &error);
// 查询
// 1、查询sql语句是否合法
// 需要传的值:
// ①数据库的对象。②sql语句。③-1不限制查询语句的长度。④结果集的内存地址。⑤nil
sqlite3_stmt *stmt;//结果集查询到的数据会存放在结果集里面。
int isVerify =sqlite3_prepare_v2(db, [@"select * from user where name like ?"UTF8String], -1, &stmt, nil);
if (isVerify ==SQLITE_OK){
// 2、绑定要查询的数据
// ①绑定要查询的数据
NSString *searchString = @"许";
// ①数据集的队像。②绑定的第几个问号。③查询的内容。④要查询的长度-1。⑤null
// 查询到的内容前后都可以有数据
NSString *s = [NSStringstringWithFormat:@"%%%@%%",searchString];
sqlite3_bind_text(stmt,1, [sUTF8String], -1,NULL);
// sqlite3_step查询还有没有下一个结果
// int next = sqlite3_step(stmt);
// while循环会一直判断括号里面的条件,所以要把查询是不是还有下一步的方法sqlite3_step(stmt)放在括号里面
while (sqlite3_step(stmt) ==SQLITE_ROW) {
// 只要走一次循环就会查找到一条数据,存放在结果集中
// 3、分离结果集中的数据。(列是从0开始)
// ①结果集的参数。②列数
char *name = (char*)sqlite3_column_text(stmt,0);
int age =sqlite3_column_int(stmt,1);
NSString *nameString = [NSStringstringWithCString:nameencoding:NSUTF8StringEncoding];
NSLog(@"=%@ %d",nameString,age);
}
}
[selfaddRightButtonItem];
}
- (void)addName:(NSString*)name age:(int)age{
char *error;
NSString *sql = [NSStringstringWithFormat:@"insert into user (name,age) values('%@',%d);",name,age];
int insertresult =sqlite3_exec(db, [sql UTF8String],NULL,NULL, &error);
if (insertresult !=SQLITE_OK) {
NSLog(@"%s",error);
}
}
- (void)addRightButtonItem{
UIBarButtonItem *barButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:selfaction:@selector(showAddView)];
self.navigationItem.rightBarButtonItem= barButton;
}
- (void)showAddView{
baview = [[UIViewalloc]initWithFrame:CGRectMake(0,0,414,414)];
baview.backgroundColor= [UIColoryellowColor];
baview.center= self.view.center;
[self.viewaddSubview:baview];
NSArray *list = @[@"名字",@"年龄"];
for (inti=0; i<2; i++) {
UITextField *textField = [[UITextFieldalloc]initWithFrame:CGRectMake(50,20+70*i,200,50)];
textField.placeholder= list[i];
textField.borderStyle= UITextBorderStyleRoundedRect;
textField.delegate= self;
textField.tag= 100+i;
textField.clearButtonMode=UITextFieldViewModeWhileEditing;
[baviewaddSubview:textField];
}
UIButton *doneButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
doneButton.frame= CGRectMake(50,150,100,50);
[doneButton setTitle:@"完成"forState:UIControlStateNormal];
doneButton.backgroundColor= [UIColorcolorWithRed:1.000green:0.435blue:0.812alpha:1.000];
doneButton.showsTouchWhenHighlighted= YES;
[baviewaddSubview:doneButton];
[doneButton addTarget:selfaction:@selector(done)forControlEvents:UIControlEventTouchDown];
}
- (void)done{
UITextField *nameText = [self.viewviewWithTag:100];
UITextField *ageText = [self.viewviewWithTag:101];
[nameText resignFirstResponder];
[ageText resignFirstResponder];
// 网数据库中添加数据
[selfaddName:nameText.textage:[ageText.textintValue]];
// 移除点击添加按钮出现的视图
[baviewremoveFromSuperview],baview= nil;
}
- (void)textFieldDidEndEditing:(UITextField*)textField{
NSLog(@"%@",textField.text);
}
- (BOOL)textFieldShouldReturn:(UITextField*)textField{
return textField;
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// ViewController.m
// 数据持久化和数据库
//
// Created by熊永静 on 16/1/4.
// Copyright © 2016年静. All rights reserved.
//
/*
数据库sqlite
sqlite3
数据持久化的一种
plist NSUserDefaults 归档 sqlite
sqlite
关系型数据库,以表格的形式存储
在sqlite中类似表格的表头的位置是字段(字段是用来查找数据的关键字《每张表格的关键字,不能重名》)
可以通过这张表格任意一个字段,查找到对应的那条数据
sqlite中可以有多个表,表与表之间是通过主键和外键关联起来的
sqlite最上面横向的是字段名,字段名不能重复(同一张表)
查找某条数据的关键字
在字段的下面是每一条数据(存储的内容)
sqlite中可以有多张表表关联 ->主键外键
--------------------------------------------
操作数据库
1、sql(structured query language)结构化查询语言
sql语句->结构化查询语言组成的一条语句
2、操作数据库的函数(C语言)
①sql语句
常用关键字:select、insert、update、delete、from、create、where、desc、order、by、group、table、drop、view、index等等
功能性:建表、删表
操作类:增、删、改、查
建表:create table
删表:drop table
建表的公式:create table表名 (字段名类型,字段名 类型);
删表公式:drop table表名
// 如果不存在这个表,就去创建(if not exists)
create table if not exists 表名 (字段名类型,字段名 类型)
// 例子
create table if not exists user (name text, age integer)
让ID自动增长把某个字段设置成主键,并让他自动增长
create table if not exists user (id integer primary key autoincrement, name text, age integer)
integer: 整型值
real: 浮点值
text: 文本字符串
blob: 二进制数据
删表公式:drop table表名
drop table user
// 如果User存在就删除
drop table if exists user
-----------------------------------------
操作数据
增删改查
增:inster into values
inster into 表名(字段名) values(值)
删:delete from
delete from 表名 where 字段 = '值';
改:updata form where set
// 将哪一个字段的值改成一个新的值
update 表名 set 字段名 = '新值' where字段名 = '值';
查:select from where
// 查询某一数据数据
select 字段(整条数据所包含的字段) from 表名 where 字段 like ?;
// 查询整个表
select from 表名 *
-----------------------------------------
iOS中操作数据库的函数
1、在使用数据库之前需要导入sqlite3
2、打开数据库和关闭数据库:
sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)打开数据库
sqlite3_close(<#sqlite3 *#>)关闭数据库
3、(如果没有建表,需要建表)增删改对应的操作
查对应的操作 关闭数据库
对表格进行操作:
sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
查询:
1、核对sql语句的合法性
sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
2、绑定要查询的数据
sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int#>, <#void (*)(void *)#>)
3、开始查询
sqlite3_column_text(<#sqlite3_stmt *#>, <#int iCol#>)
使用完毕数据库,及时关闭数据库
*/
#import"ViewController.h"
#import <sqlite3.h>
@interfaceViewController ()<UITextFieldDelegate>
{
sqlite3 *db;
UIView *baview;
}
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
// 打开数据库
// (1)数据库的文件路径
// (2)打开数据库
// 创建一个叫课件的数据库 课件.sqlite
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString *path = [[pathList lastObject]stringByAppendingPathComponent:@"课件.sqlite"];
// [path UTF8String];直接转换成char *类型
// 需要两个值:1、文件路径2、数据库对象的内存地址
// sqlite3_open返回值是int类型,可以通过系统定义的一个宏定义来判断是否打开成功
if (sqlite3_open([pathUTF8String], &db) != SQLITE_OK) {
NSLog(@"打开数据库失败");
sqlite3_close(db);//关闭数据库
}
else{
NSLog(@"%@",path);
}
//建表
// 需要传的对象
// 1、数据库对象
// 2、sql语句
// 3、4、NULL
// 5、传一个char *类型的字符串如果有错误,会返回一个错误信息
// char *error;
// sqlite3_exec(db, [@"建表(添加、修改、删除)的语句" UTF8String], NULL, NULL, &error);
/*
在操作数据库的时候删除或者添加字段都需要将原来的数据库删除再去运行,否则回崩溃。
*/
// 在""内使用字符串使用''
// [self addName:@"肖耐" age:18];
// [self addName:@"许弋" age:18];
// 改
// sqlite3_exec(db, [@"update user set name = '豆豆' where name = '小明';"UTF8String], NULL, NULL, &error);
// 查询
// 1、查询sql语句是否合法
// 需要传的值:
// ①数据库的对象。②sql语句。③-1不限制查询语句的长度。④结果集的内存地址。⑤nil
sqlite3_stmt *stmt;//结果集查询到的数据会存放在结果集里面。
int isVerify =sqlite3_prepare_v2(db, [@"select * from user where name like ?"UTF8String], -1, &stmt, nil);
if (isVerify ==SQLITE_OK){
// 2、绑定要查询的数据
// ①绑定要查询的数据
NSString *searchString = @"许";
// ①数据集的队像。②绑定的第几个问号。③查询的内容。④要查询的长度-1。⑤null
// 查询到的内容前后都可以有数据
NSString *s = [NSStringstringWithFormat:@"%%%@%%",searchString];
sqlite3_bind_text(stmt,1, [sUTF8String], -1,NULL);
// sqlite3_step查询还有没有下一个结果
// int next = sqlite3_step(stmt);
// while循环会一直判断括号里面的条件,所以要把查询是不是还有下一步的方法sqlite3_step(stmt)放在括号里面
while (sqlite3_step(stmt) ==SQLITE_ROW) {
// 只要走一次循环就会查找到一条数据,存放在结果集中
// 3、分离结果集中的数据。(列是从0开始)
// ①结果集的参数。②列数
char *name = (char*)sqlite3_column_text(stmt,0);
int age =sqlite3_column_int(stmt,1);
NSString *nameString = [NSStringstringWithCString:nameencoding:NSUTF8StringEncoding];
NSLog(@"=%@ %d",nameString,age);
}
}
[selfaddRightButtonItem];
}
- (void)addName:(NSString*)name age:(int)age{
char *error;
NSString *sql = [NSStringstringWithFormat:@"insert into user (name,age) values('%@',%d);",name,age];
int insertresult =sqlite3_exec(db, [sql UTF8String],NULL,NULL, &error);
if (insertresult !=SQLITE_OK) {
NSLog(@"%s",error);
}
}
- (void)addRightButtonItem{
UIBarButtonItem *barButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:selfaction:@selector(showAddView)];
self.navigationItem.rightBarButtonItem= barButton;
}
- (void)showAddView{
baview = [[UIViewalloc]initWithFrame:CGRectMake(0,0,414,414)];
baview.backgroundColor= [UIColoryellowColor];
baview.center= self.view.center;
[self.viewaddSubview:baview];
NSArray *list = @[@"名字",@"年龄"];
for (inti=0; i<2; i++) {
UITextField *textField = [[UITextFieldalloc]initWithFrame:CGRectMake(50,20+70*i,200,50)];
textField.placeholder= list[i];
textField.borderStyle= UITextBorderStyleRoundedRect;
textField.delegate= self;
textField.tag= 100+i;
textField.clearButtonMode=UITextFieldViewModeWhileEditing;
[baviewaddSubview:textField];
}
UIButton *doneButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
doneButton.frame= CGRectMake(50,150,100,50);
[doneButton setTitle:@"完成"forState:UIControlStateNormal];
doneButton.backgroundColor= [UIColorcolorWithRed:1.000green:0.435blue:0.812alpha:1.000];
doneButton.showsTouchWhenHighlighted= YES;
[baviewaddSubview:doneButton];
[doneButton addTarget:selfaction:@selector(done)forControlEvents:UIControlEventTouchDown];
}
- (void)done{
UITextField *nameText = [self.viewviewWithTag:100];
UITextField *ageText = [self.viewviewWithTag:101];
[nameText resignFirstResponder];
[ageText resignFirstResponder];
// 网数据库中添加数据
[selfaddName:nameText.textage:[ageText.textintValue]];
// 移除点击添加按钮出现的视图
[baviewremoveFromSuperview],baview= nil;
}
- (void)textFieldDidEndEditing:(UITextField*)textField{
NSLog(@"%@",textField.text);
}
- (BOOL)textFieldShouldReturn:(UITextField*)textField{
return textField;
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end