iOS中操作SQLite数据库

来源:互联网 发布:kmp算法next例题 编辑:程序博客网 时间:2024/06/06 00:36

一般数据存储方式

  • 文件读写,仅支持四种数据NSString、NSArray、NSDictionary、NSData
  • 归档
  • NSUserDefaults偏好设置

  • 这三种存储方式,要对某个数据作修改,都是整体覆盖操作,效率非常低。

SQLite

优点

  • SQLite是以表的形式存数据,类似excel。要修改某一条数据,可以单独对其操作而不需要整体覆盖。
  • 轻量级数据库,占用内存小,速度快,
  • 跨平台,可以在iOS和安卓通用

命令

SQL:结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
常见的SQL语句有创建(Create),插入(Insert),更新(Update),删除(Delete),查询(Select)

SQLite具体操作

  • 我这里用的是火狐浏览器的工具->附加组件中下载的SQLite manager来操作SQLite

创建

  • 格式:create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型。。。)
    这里写图片描述
  • 图示创建一个Person,其中id是为了区别数据,同时要把它设置成主键,好处是主键不能为空,不能重复。写完语句点击Run SQL,就创建成功,左侧表里就多了一个Person
  • 点击左侧表里的Person,点击右边structure可以查看结构
  • 点击Browse&Search可以查看数据

插入

  • 格式:insert into 表名称(列1,列2…)values(值1,值2…)。注意字符串一般用单引号’,双引号也可以
    这里写图片描述

查询

  • 格式:select 列名称 from 表名称
  • 这里可以用*表示所有列
    这里写图片描述
  • 可以加后缀,多个条件
    这里写图片描述

更新

  • 格式:update 表名称 set 列名称 = 新值 where 列名称
  • 如下把id = 2的列的name改成李四
    这里写图片描述

删除

  • 格式:delete from 表名 where 列名
    这里写图片描述

在iOS中集成SQLite

  • 手动导入框架:Build Phases ->Link Binary With Libraries -> + ->libsqlite3.0.tbd
  • 导入头文件:sqlite3.h
  • 一般创建一个管理类SQLiteManager,并且用单例模式
static SQLiteManager *_manager = nil;+ (SQLiteManager *)shareManager{    return [[self alloc] init];}+ (instancetype)allocWithZone:(struct _NSZone *)zone{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _manager = [super allocWithZone:zone];    });    return _manager;}
  • 提供一个打开数据库的方法
// 建个指针sqlite3 *ppDb;- (void)open{    // document路径    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];    // 拼接数据库路径    NSString *SQLitePath = [documentPath stringByAppendingPathComponent:@"testSQLite.sqlite"];    // 打开数据库,这里需要把OC的字符串转换成C语言的字符串,第二个参数需要传入一个指针的地址    sqlite3_open(SQLitePath.UTF8String, &ppDb);    // 如果成功    if (result == SQLITE_OK)...else    // 如果失败}
  • 提供一个关闭数据库的方法
- (void)close{    int result = sqlite3_close(ppDb);    if (result == SQLITE_OK) ...}
  • 创建表的方法
- (void)creatList{    // SQL语句    NSString *sqlString = @"create table Person (id integer,name text,age integer)";    // 执行sql语句    // 第一个参数是sqlite3指针,第二个参数是sql语句,需要转一下,第三个参数是回调,这里直接nul,最后一个参数是错误信息,建个指针传进去    char *error = nil;    sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);    // 判断是否出现错误    if (error == nil) {        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"数据库执行结果" message:@"创建表成功" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];        [alertView show];    }else{        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"数据库执行结果" message:@"创建表失败" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];        [alertView show];    }}
  • 插入数据的方法,其中执行sql语句的调用方法都是一样的
- (void)insert{    NSString *sqlString = @"insert into Person (name,age) values ('张三';18)";    char *error = nil;    sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);    if (error == nil) 。。。
  • 更新数据的方法
- (void)update{    NSString *sqlString = @"update Person set 'name' = '李四' where id = 1";    char *error = nil;    sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);    if (error == nil) ...}
  • 删除数据的方法
- (void)deleteDate{    NSString *sqlString = @"delete from Person where id = 1";    char *error = nil;    sqlite3_exec(ppDb, sqlString.UTF8String, nil, nil, &error);    if (error == nil) ...    }}
  • 查询数据的方法,这里和上面的几个操作不同
- (void)select{    NSString *sqlString = @"select * from Person";    // 准备sql语句    // 第三个参数是sql语句的长度,如果写入sqlString.length会报个警告类型不匹配,我们可以写个-1,这样系统会自动计算长度,第三个参数需要传入一个sql的语句管理者指针,最后一个参数是预留参数    sqlite3_stmt *stmt = nil;    sqlite3_prepare(ppDb, sqlString.UTF8String, -1, &stmt, nil);    // 单步执行语句    // 判断如果有数据,就执行语句    while (sqlite3_step(stmt) == SQLITE_ROW) {        // 根据数据类型获取数据,第一个参数是语句管理者,第二个参数是第几列        int ID = sqlite3_column_int(stmt, 0);        const unsigned char *nameText = sqlite3_column_text(stmt, 1);        // 把获取到的C语言的字符串转成OC的字符串        NSString *name = [NSString stringWithUTF8String:(const char *)nameText];        int age = sqlite3_column_int(stmt, 2);        NSLog(@"ID=%d,name=%@,age=%d",ID,name,age);    }    // 释放sql语句管理者    sqlite3_finalize(stmt);}
1 0