mysql数据类型mdn_SQLite简单介绍

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //

2 // YYViewController.m

3 // 02-SQLite的应用

4 //

5

6 #import "YYViewController.h"

7 #import

8

9 @interface YYViewController ()

10 //db是数据库的句柄,就是数据库的象征,要对数据库进行增删改查,就得操作这个实例

11 @property(nonatomic,assign)sqlite3 *db;

12 - (IBAction)insert;

13 - (IBAction)delete;

14 - (IBAction)update;

15 - (IBAction)select;

16

17 @end

18

19 @implementation YYViewController

20

21 - (void)viewDidLoad

22 {

23 [super viewDidLoad];

24

25 // sqlite3 *db;

26

27 //获得数据库文件的路径

28 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

29 NSString *fileName=[doc stringByAppendingPathComponent:@"students.sqlite"];

30 //将OC字符串转换为c语言的字符串

31 const char *cfileName=fileName.UTF8String;

32

33 //1.打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)

34 int result = sqlite3_open(cfileName, &_db);

35 if (result==SQLITE_OK) { //打开成功

36 NSLog(@"成功打开数据库");

37

38 //2.创建表

39 const char *sql="CREATE TABLE t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";

40 char *errmsg=NULL;

41 result = sqlite3_exec(self.db, sql, NULL, NULL, &errmsg);

42 if (result==SQLITE_OK) {

43 NSLog(@"创表成功");

44 }else

45 {

46 // NSLog(@"创表失败----%s",errmsg);

47 printf("创表失败---%s----%s---%d",errmsg,__FILE__,__LINE__);

48 }

49 }else

50 {

51 NSLog(@"打开数据库失败");

52 }

53 }

54

55 - (IBAction)insert {

56 for (int i=0; i<20; i++) {

57 //1.拼接SQL语句

58 NSString *name=[NSString stringWithFormat:@"文晓--%d",arc4random_uniform(100)];

59 int age=arc4random_uniform(20)+10;

60 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_students (name,age) VALUES ('%@',%d);",name,age];

61

62 //2.执行SQL语句

63 char *errmsg=NULL;

64 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &errmsg);

65 if (errmsg) {//如果有错误信息

66 NSLog(@"插入数据失败--%s",errmsg);

67 }else

68 {

69 NSLog(@"插入数据成功");

70 }

71 }

72 }

73

74 - (IBAction)delete {

75 }

76

77 - (IBAction)updata {

78 }

79

80 - (IBAction)select {

81 const char *sql="SELECT id,name,age FROM t_students WHERE age<20;";

82 sqlite3_stmt *stmt=NULL;

83

84 //进行查询前的准备工作

85 if (sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL语句没有问题

86 NSLog(@"查询语句没有问题");

87

88 //每调用一次sqlite3_step函数,stmt就会指向下一条记录

89 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录

90 //取出数据

91 //(1)取出第0列字段的值(int类型的值)

92 int ID=sqlite3_column_int(stmt, 0);

93 //(2)取出第1列字段的值(text类型的值)

94 const unsigned char *name=sqlite3_column_text(stmt, 1);

95 //(3)取出第2列字段的值(int类型的值)

96 int age=sqlite3_column_int(stmt, 2);

97 // NSLog(@"%d %s %d",ID,name,age);

98 printf("%d %s %d\n",ID,name,age);

99 }

100 }else

101 {

102 NSLog(@"查询语句有问题");

103 }

104

105 }

106 @end

48304ba5e6f9fe08f3fa1abda7d326ab.png

IOS开发数据库篇—SQLite模糊查询

一、示例

说明:本文简单示例了SQLite的模糊查询

1.新建一个继承自NSObject的模型

4edf2277e333a8c1d785ef8fe5da9111.png

该类中的代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //

2 // YYPerson.h

3 // 03-模糊查询

4 //

5 // Created by apple on 14-7-27.

6 // Copyright (c) 2014年 wendingding. All rights reserved.

7 //

8

9 #import

10

11 @interface YYPerson : NSObject

12 @property (nonatomic, assign) int ID;

13 @property (nonatomic, copy) NSString *name;

14 @property (nonatomic, assign) int age;

15

16 @end

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.新建一个工具类,用来管理模型

8e0adb01af440b0175580c0b9f515bcb.png

工具类中的代码设计如下:

YYPersonTool.h文件

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //

2 // YYPersonTool.h

3 // 03-模糊查询

4 //

5 // Created by apple on 14-7-27.

6 // Copyright (c) 2014年 wendingding. All rights reserved.

7 //

8

9 #import

10

11 @class YYPerson;

12 @interface YYPersonTool : NSObject

13 /**

14 * 保存一个联系人

15 */

16 + (void)save:( YYPerson*)person;

17

18 /**

19 * 查询所有的联系人

20 */

21 + (NSArray *)query;

22 + (NSArray *)queryWithCondition:(NSString *)condition;

23 @end

48304ba5e6f9fe08f3fa1abda7d326ab.png

YYPersonTool.m文件

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //

2 // YYPersonTool.m

3 // 03-模糊查询

4 //

5 // Created by apple on 14-7-27.

6 // Copyright (c) 2014年 wendingding. All rights reserved.

7 //

8

9 #import "YYPersonTool.h"

10 #import "YYPerson.h"

11

12 #import

13 @interface YYPersonTool ()

14 //@property(nonatomic,assign)sqlite3 *db;

15 @end

16 @implementation YYPersonTool

17

18 static sqlite3 *_db;

19 //首先需要有数据库

20 +(void)initialize

21 {

22 //获得数据库文件的路径

23 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

24 NSString *fileName=[doc stringByAppendingPathComponent:@"person.sqlite"];

25 //将OC字符串转换为c语言的字符串

26 const char *cfileName=fileName.UTF8String;

27

28 //1.打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)

29 int result = sqlite3_open(cfileName, &_db);

30 if (result==SQLITE_OK) { //打开成功

31 NSLog(@"成功打开数据库");

32

33 //2.创建表

34 const char *sql="CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";

35

36 char *errmsg=NULL;

37 result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg);

38 if (result==SQLITE_OK) {

39 NSLog(@"创表成功");

40 }else

41 {

42 printf("创表失败---%s",errmsg);

43 }

44 }else

45 {

46 NSLog(@"打开数据库失败");

47 }

48

49 }

50 //保存一条数据

51 +(void)save:(YYPerson *)person

52 {

53 //1.拼接SQL语句

54

55 NSString *sql=[NSString stringWithFormat:@"INSERT INTO t_person (name,age) VALUES ('%@',%d);",person.name,person.age];

56

57 //2.执行SQL语句

58 char *errmsg=NULL;

59 sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);

60 if (errmsg) {//如果有错误信息

61 NSLog(@"插入数据失败--%s",errmsg);

62 }else

63 {

64 NSLog(@"插入数据成功");

65 }

66

67 }

68

69 +(NSArray *)query

70 {

71 return [self queryWithCondition:@""];

72 }

73

74 //模糊查询

75 +(NSArray *)queryWithCondition:(NSString *)condition

76 {

77

78 //数组,用来存放所有查询到的联系人

79 NSMutableArray *persons=nil;

80 /*

81 [NSString stringWithFormat:@"SELECT id, name, age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;", condition];

82 NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name=%@;",condition];

83 */

84 NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition];

85 NSLog(@"%@",NSsql);

86 const char *sql=NSsql.UTF8String;

87

88 sqlite3_stmt *stmt=NULL;

89

90 //进行查询前的准备工作

91 if (sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK) {//SQL语句没有问题

92 NSLog(@"查询语句没有问题");

93

94 persons=[NSMutableArray array];

95

96 //每调用一次sqlite3_step函数,stmt就会指向下一条记录

97 while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一条记录

98

99 //取出数据

100 //(1)取出第0列字段的值(int类型的值)

101 int ID=sqlite3_column_int(stmt, 0);

102 //(2)取出第1列字段的值(text类型的值)

103 const unsigned char *name=sqlite3_column_text(stmt, 1);

104 //(3)取出第2列字段的值(int类型的值)

105 int age=sqlite3_column_int(stmt, 2);

106

107 YYPerson *p=[[YYPerson alloc]init];

108 p.ID=ID;

109 p.name=[NSString stringWithUTF8String:(const char *)name];

110 p.age=age;

111 // NSLog(@"%@",p.name);

112 [persons addObject:p];

113 // NSLog(@"haha%@",persons);

114 }

115 }else

116 {

117 NSLog(@"查询语句有问题");

118 }

119

120 //NSLog(@"haha%@",persons);

121 return persons;

122 }

123 @end

48304ba5e6f9fe08f3fa1abda7d326ab.png

3.在storyboard中,删除原有的控制器,放一个导航控制器和UITableViewController控制器,并关联

6cb7778e533b487168d3fcd94b54ec7b.png

在代码中,让主控制器直接继承自UITableViewController

代码设计如下:

YYViewController.m文件

48304ba5e6f9fe08f3fa1abda7d326ab.png

1 //

2 // YYViewController.m

3 // 03-模糊查询

4 //

5 // Created by apple on 14-7-27.

6 // Copyright (c) 2014年 wendingding. All rights reserved.

7 //

8

9 #import "YYViewController.h"

10 #import "YYPerson.h"

11 #import "YYPersonTool.h"

12

13 @interface YYViewController ()

14

15 //添加一个数组,用来保存person

16 @property(nonatomic,strong)NSArray *persons;

17 @end

18

19 @implementation YYViewController

20

21 #pragma mark-懒加载

22 -(NSArray *)persons

23 {

24 if (_persons==nil) {

25 _persons=[YYPersonTool query];

26 }

27 return _persons;

28 }

29

30 //1.在初始化方法中添加一个搜索框

31 - (void)viewDidLoad

32 {

33 [super viewDidLoad];

34

35 //设置搜索框

36 UISearchBar *search=[[UISearchBar alloc]init];

37 search.frame=CGRectMake(0, 0, 300, 44);

38 search.delegate=self;

39 self.navigationItem.titleView=search;

40 }

41

42 //2.设置tableView的数据

43 //设置有多少行数据

44 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

45 {

46 // return 10;

47 return self.persons.count;

48 }

49 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

50 {

51 //1.去缓存中取cll,若没有则自己创建并标记

52 static NSString *ID=@"ID";

53 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];

54 if (cell==nil) {

55 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

56 }

57

58 //2.设置每个cell的数据

59 //先取出数据模型

60 YYPerson *person=self.persons[indexPath.row];

61 //设置这个cell的姓名(name)和年龄

62 cell.textLabel.text=person.name;

63 cell.detailTextLabel.text=[NSString stringWithFormat:@"年龄 %d",person.age];

64 //3.返回cell

65 return cell;

66 }

67

68 - (IBAction)add:(UIBarButtonItem *)sender {

69 // 初始化一些假数据

70 NSArray *names = @[@"西门抽血", @"西门抽筋", @"西门抽风", @"西门吹雪", @"东门抽血", @"东门抽筋", @"东门抽风", @"东门吹雪", @"北门抽血", @"北门抽筋", @"南门抽风", @"南门吹雪"];

71 for (int i = 0; i<20; i++) {

72 YYPerson *p = [[YYPerson alloc] init];

73 p.name = [NSString stringWithFormat:@"%@-%d", names[arc4random_uniform(names.count)], arc4random_uniform(100)];

74 p.age = arc4random_uniform(20) + 20;

75 [YYPersonTool save:p];

76 }

77 }

78

79 #pragma mark-搜索框的代理方法

80 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

81 {

82 self.persons=[YYPersonTool queryWithCondition:searchText];

83 //刷新表格

84 [self.tableView reloadData];

85 [searchBar resignFirstResponder];

86 }

87

88 @end

48304ba5e6f9fe08f3fa1abda7d326ab.png

实现效果:

3af80a51dbc9e74c1629d144acb3ac02.png   

a67b381db0b4a4aca1e5e2398472d4e7.png

二、简单说明

关于:  NSString *NSsql=[NSString stringWithFormat:@"SELECT id,name,age FROM t_person WHERE name like '%%%@%%' ORDER BY age ASC;",condition];

注意:name like ‘西门’,相当于是name = ‘西门’。

name like ‘%西%’,为模糊搜索,搜索字符串中间包含了’西’,左边可以为任意字符串,右边可以为任意字符串,的字符串。

但是在 stringWithFormat:中%是转义字符,两个%才表示一个%。

打印查看:

e0afde79c5223ae8e2fcacc1c86240fc.png

iOS开发数据库篇—SQLite常用的函数

一、简单说明

1.打开数据库

int sqlite3_open(

const char *filename,   // 数据库的文件路径

sqlite3 **ppDb          // 数据库实例

);

2.执行任何SQL语句

int sqlite3_exec(

sqlite3*,                                  // 一个打开的数据库实例

const char *sql,                           // 需要执行的SQL语句

int (*callback)(void*,int,char**,char**),  // SQL语句执行完毕后的回调

void *,                                    // 回调函数的第1个参数

char **errmsg                              // 错误信息

);

3.检查SQL语句的合法性(查询前的准备)

int sqlite3_prepare_v2(

sqlite3 *db,            // 数据库实例

const char *zSql,       // 需要检查的SQL语句

int nByte,              // SQL语句的最大字节长度

sqlite3_stmt **ppStmt,  // sqlite3_stmt实例,用来获得数据库数据

const char **pzTail

);

4.查询一行数据

int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW

5.利用stmt获得某一字段的值(字段的下标从0开始)

double sqlite3_column_double(sqlite3_stmt*, int iCol);  // 浮点数据

int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);  // 字符串数据

二、SQLite编码

1.创建、打开、关闭数据库

创建或打开数据库

// path是数据库文件的存放路径

sqlite3 *db = NULL;

int result = sqlite3_open([path UTF8String], &db);

代码解析:

sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则表示成功打开数据库

sqlite3 *db:一个打开的数据库实例

数据库文件的路径必须以C字符串(而非NSString)传入

关闭数据库:sqlite3_close(db);

2.执行不返回数据的SQL语句

执行创表语句

char *errorMsg = NULL;  // 用来存储错误信息

char *sql = "create table if not exists t_person(id integer primary key autoincrement, name text, age integer);";

int result = sqlite3_exec(db, sql, NULL, NULL, &errorMsg);

代码解析:

sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据

sqlite3_exec()还可以执行的语句:

(1)开启事务:begin transaction;

(2)回滚事务:rollback;

(3)提交事务:commit;

3.带占位符插入数据

char *sql = "insert into t_person(name, age) values(?, ?);";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

sqlite3_bind_text(stmt, 1, "母鸡", -1, NULL);

sqlite3_bind_int(stmt, 2, 27);

}

if (sqlite3_step(stmt) != SQLITE_DONE) {

NSLog(@"插入数据错误");

}

sqlite3_finalize(stmt);

代码解析:

sqlite3_prepare_v2()返回值等于SQLITE_OK,说明SQL语句已经准备成功,没有语法问题

sqlite3_bind_text():大部分绑定函数都只有3个参数

(1)第1个参数是sqlite3_stmt *类型

(2)第2个参数指占位符的位置,第一个占位符的位置是1,不是0

(3)第3个参数指占位符要绑定的值

(4)第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度

(5)第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作

sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕

sqlite_finalize():销毁sqlite3_stmt *对象

4.查询数据

char *sql = "select id,name,age from t_person;";

sqlite3_stmt *stmt;

if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {

while (sqlite3_step(stmt) == SQLITE_ROW) {

int _id = sqlite3_column_int(stmt, 0);

char *_name = (char *)sqlite3_column_text(stmt, 1);

NSString *name = [NSString stringWithUTF8String:_name];

int _age = sqlite3_column_int(stmt, 2);

NSLog(@"id=%i, name=%@, age=%i", _id, name, _age);

}

}

sqlite3_finalize(stmt);

代码解析:

sqlite3_step()返回SQLITE_ROW代表遍历到一条新记录

sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值