首先引入#import <sqlite3.h>
/*
创建
格式:create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型。。。)
creat table Person(id integer primary key, name text,age,integer)
插入
格式:insert into 表名称(列1,列2…)values(值1,值2…)。注意字符串一般用单引号’,双引号也可以
insert into Person(name, age)values(@"张三",18)
查询
格式:select 列名称 from 表名称
这里可以用*表示所有列
select * from Person
可以加后缀,多个条件
select * from Person where id = 2
更新
格式:update 表名称 set 列名称 = 新值 where 列名称
如下把id = 2的列的name改成李四
update Person set name = @"李四" where id = 2
删除
格式:delete from 表名 where 列名
delete from Person where id = 2
*/
//SQLite是以表的形式存数据,类似excel。要修改某一条数据,可以单独对其操作而不需要整体覆盖。
//轻量级数据库,占用内存小,速度快,
//跨平台,可以在iOS和安卓通用
//SQL:结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
//常见的SQL语句有创建(Create),插入(Insert),更新(Update),删除(Delete),查询(Select)
#import "myViewController.h"
#import "loadViewController.h"
#import <sqlite3.h>
#define TABLENAME @"mytable"
#define ID @"mynaid"
#define NAME @"myname"
#define ADDRESS @"myaddress"
#define AGE @"myage"
static sqlite3 *db;//是指向数据库的指针,我们其他操作
@interface myViewController ()
@property(nonatomic,strong)UITextField *textField1;
@property(nonatomic,strong)UITextField *textField2;
@property(nonatomic,strong)UITextField *textField3;
@end
@implementation myViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor cyanColor];
UIButton *btn1=[[UIButton alloc] initWithFrame:CGRectMake(100, 20, 100, 30)];
[btn1 setTitle:@"建表" forState:UIControlStateNormal];
[btn1 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
btn1.titleLabel.font=[UIFont systemFontOfSize:20.f];
btn1.backgroundColor=[UIColor whiteColor];
[btn1 addTarget:self action:@selector(Method1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
UIButton *nextbtn=[[UIButton alloc] initWithFrame:CGRectMake(100+100, 20+40, 100, 30)];
[nextbtn setTitle:@"next" forState:UIControlStateNormal];
[nextbtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
nextbtn.titleLabel.font=[UIFont systemFontOfSize:20.f];
nextbtn.backgroundColor=[UIColor whiteColor];
[nextbtn addTarget:self action:@selector(nextMethod) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:nextbtn];
UIButton *btn2=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50, 100, 30)];
[btn2 setTitle:@"加入" forState:UIControlStateNormal];
[btn2 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
btn2.titleLabel.font=[UIFont systemFontOfSize:20.f];
btn2.backgroundColor=[UIColor whiteColor];
[btn2 addTarget:self action:@selector(Method2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2];
UIButton *btn3=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50, 100, 30)];
[btn3 setTitle:@"改" forState:UIControlStateNormal];
[btn3 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
btn3.titleLabel.font=[UIFont systemFontOfSize:20.f];
btn3.backgroundColor=[UIColor whiteColor];
[btn3 addTarget:self action:@selector(Method3) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn3];
UIButton *btn4=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50+50, 100, 30)];
[btn4 setTitle:@"删除" forState:UIControlStateNormal];
[btn4 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
btn4.titleLabel.font=[UIFont systemFontOfSize:20.f];
btn4.backgroundColor=[UIColor whiteColor];
[btn4 addTarget:self action:@selector(Method4) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn4];
UIButton *btn5=[[UIButton alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50, 100, 30)];
[btn5 setTitle:@"查询" forState:UIControlStateNormal];
[btn5 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
btn5.titleLabel.font=[UIFont systemFontOfSize:20.f];
btn5.backgroundColor=[UIColor whiteColor];
[btn5 addTarget:self action:@selector(Method5) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn5];
_textField1=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50, 200, 40)];
_textField1.placeholder=@"请输入姓名";
_textField1.backgroundColor=[UIColor whiteColor];
_textField1.keyboardType=UIKeyboardTypeDefault;
[self.view addSubview:_textField1];
_textField2=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50+50, 200, 40)];
_textField2.placeholder=@"请输入年龄";
_textField2.backgroundColor=[UIColor whiteColor];
_textField2.keyboardType=UIKeyboardTypeNumberPad;
[self.view addSubview:_textField2];
_textField3=[[UITextField alloc] initWithFrame:CGRectMake(100, 20+50+50+50+50+50+50+50, 200, 40)];
_textField3.placeholder=@"请输入地址";
_textField3.backgroundColor=[UIColor whiteColor];
_textField3.keyboardType=UIKeyboardTypeDefault;
[self.view addSubview:_textField3];
// Do any additional setup after loading the view.
}
-(void)Method1
{
[self createTable];
}
-(void)Method2
{
[self insertData];
}
-(void)Method3
{
[self updateData];
}
-(void)Method4
{
[self deleteData];
}
-(void)Method5
{
[self selectData];
//[self selectpartdata];
}
//打开数据库
-(void) openDB{
//获取文件路径
NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *strPath = [str stringByAppendingPathComponent:@"my.sqlite"];
NSLog(@"数据库的文件路径==%@",strPath);
//打开数据库
//如果数据库存在就打开,如果不存在就创建一个再打开
if (sqlite3_open([strPath UTF8String], &db) == SQLITE_OK) {
NSLog(@"数据库打开成功");
//return YES;
}else{
NSLog(@"数据库打开失败");
sqlite3_close(db);
//return NO;
}
}
//关闭数据库
- (void)closeSqlite {
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
db = nil;// 把指针 重置为空 方便下次打开
NSLog(@"数据库关闭成功");
} else {
NSLog(@"数据库关闭失败");
}
}
//增删改查时都会进行的操作
-(void)execSql:(NSString *)sql
{
NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *strPath = [str stringByAppendingPathComponent:@"my.sqlite"];
if (sqlite3_open([strPath UTF8String], &db) == SQLITE_OK) {
char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
NSLog(@"数据库操作数据失败!");
}else{
NSLog(@"数据库每次进行的操作%@",sql);
}
}
[self closeSqlite];
}
//创建表
-(void)createTable
{
//1.打开数据库
[self openDB];
// 2.写sql语句 根据model 创建表
// create table Student (Student 是表名)
// number integer primary key not NULL 主键值 如果不操作 自增
NSString *sqlCreateTable = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT, '%@' INTEGER, '%@' TEXT)",TABLENAME,ID,NAME,AGE,ADDRESS];
// 3.执行sql语句 创建表
/**
* 第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。
第2个参数constchar*sql是一条sql 语句,以\0结尾。
第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写
法,以及这个参数的使用。
第5个参数char** errmsg 是错误信息。
*
*/
/*
int result = sqlite3_exec(db, sqlCreateTable.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
}
// 4.关闭数据库
[self closeSqlite];
*/
[self execSql:sqlCreateTable];
}
//加入数据
-(void) insertData{
[self openDB];
NSString *insertSql1= [NSString stringWithFormat:
@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",
TABLENAME, NAME, AGE, ADDRESS, @"张三", @"13", @"济南"];
[self execSql:insertSql1];
//NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",TABLENAME, NAME, AGE, ADDRESS, @"李四", @"12", @"济南"];
NSString *insertSql2 = [NSString stringWithFormat:@"INSERT INTO '%@' ('%@', '%@', '%@') VALUES ('%@', '%@', '%@')",TABLENAME, NAME, AGE, ADDRESS, _textField1.text, _textField2.text, _textField3.text];
[self execSql:insertSql2];
}
//更改数据 根据名字 更改学号
-(void) updateData{
[self openDB];
NSString *updateSql = [NSString stringWithFormat:
@"UPDATE '%@' SET '%@' = '%@' WHERE '%@' = '%@'",
TABLENAME, AGE, @"15" ,AGE, @"13"];
[self execSql:updateSql];
}
//删除对应的
-(void) deleteData{
[self openDB];
NSString *sdeleteSql = [NSString stringWithFormat:
@"delete from %@ where %@ = '%@'",
TABLENAME, NAME, @"张三"];
[self execSql:sdeleteSql];
}
//查询部分数据
- (void)selectpartdata
{
[self openDB];
NSString *sqlString = @"select * from TABLENAME where myage = ?";
// 准备sql语句
// 第三个参数是sql语句的长度,如果写入sqlString.length会报个警告类型不匹配,我们可以写个-1,这样系统会自动计算长度,第三个参数需要传入一个sql的语句管理者指针,最后一个参数是预留参数
sqlite3_stmt *stmt = nil;
// 生成语句对象
int result =sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, nil);
if (result==SQLITE_OK) {
// 如果查询语句或者其他sql语句有条件,在准备语句对象的函数内部,sql语句中用?来代替条件,那么在执行语句之前,一定要绑定
// 1代表sql语句中的第一个问号,问号的下标是从1开始的
sqlite3_bind_int(stmt, 1, 1);
if (sqlite3_step(stmt) == SQLITE_ROW) {
// 获取记录中的字段信息
const unsigned char *cName = sqlite3_column_text(stmt, 1);
const unsigned char *cGender = sqlite3_column_text(stmt, 2);
// 将C语言字符串转换成OC字符串
NSString *name = [NSString stringWithUTF8String:(const char *)cName];
NSString *gender = [NSString stringWithUTF8String:(const char *)cGender];
NSLog(@"%@ %@", name, gender);
}
}
}
//查询所有数据
-(void) selectData{
[self openDB];
NSString *sqlQuery = [NSString stringWithFormat:
@"SELECT * FROM %@",TABLENAME];
sqlite3_stmt * statement;
//进行查询前的准备工作
if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {//SQL语句没有问题
NSLog(@"查询语句没有问题");
//查询结果集中一条一条的遍历所有的记录,这里的数字对应的是列值,注意这里的列值
//每调用一次sqlite3_step函数,stmt就会指向下一条记录
while (sqlite3_step(statement) == SQLITE_ROW) {//找到一条记录
// 获取一共多少列
int count = sqlite3_column_count(statement);
NSLog(@"总列数==%d", count);
const char *cKey = sqlite3_column_name(statement, 2);
NSString *key = [NSString stringWithUTF8String:cKey];
NSLog(@"获取到的表名==%@" ,key);
//(1)取出第1列字段的值(text类型的值)
char *name = (char*)sqlite3_column_text(statement, 1);
NSString *nsNameStr = [[NSString alloc] initWithUTF8String:name];
//(2)取出第2列字段的值(int类型的值)
int age = sqlite3_column_int(statement, 2);
//(3)取出第3列字段的值(text类型的值)
char *address = (char*)sqlite3_column_text(statement, 3);
NSString *nsAddressStr = [[NSString alloc]initWithUTF8String:address];
NSLog(@"查询全部的数据 name==%@ age==%d address==%@",nsNameStr,age, nsAddressStr);
}
}else{
NSLog(@"查询语句有问题:%@",sqlQuery);
}
}
/*
//用字典存储所有数据。返回要查看的所有数据的数组
- (NSArray *)querySQL:(NSString *)querySQL
{
// 定义游标对象
sqlite3_stmt *stmt = nil;
// 准备查询
// 1> 参数一:数据库对象
// 2> 参数二:查询语句
// 3> 参数三:查询语句的长度:-1
// 4> 参数四:句柄(游标对象)
if (sqlite3_prepare_v2(self.db, querySQL.UTF8String, -1, &stmt, nil) != SQLITE_OK) {
NSLog(@"准备查询失败");
return nil;
};
// 准备成功,开始查询数据
NSMutableArray *dictArray = [NSMutableArray array];
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 获取一共多少列
int count = sqlite3_column_count(stmt);
// 定义字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (int i = 0; i < count; i++) {
// 取出i位置列的字段名,作为字典的键
const char *cKey = sqlite3_column_name(stmt, i);
NSString *key = [NSString stringWithUTF8String:cKey];
// 取出i位置的存储的值,作为字典的值
const char *cValue = (const char *)sqlite3_column_text(stmt, i);
NSString *value = [NSString stringWithUTF8String:cValue];
// 将键值对一个一个放入字典中
[dict setValue:value forKey:key];
}
// 将获取的字典放入数组中
[dictArray addObject:dict];
}
// 返回取出所有数据的数组
return dictArray;
}
*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[_textField1 resignFirstResponder];
[_textField2 resignFirstResponder];
[_textField3 resignFirstResponder];
return YES;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//返回一个BOOL值,指定是否循序文本字段开始编辑,返回NO时不能唤起键盘进行编辑
return YES;
}
-(void)nextMethod
{
loadViewController *load=[[loadViewController alloc] init];
[self presentViewController:load animated:YES completion:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}