淘先锋技术网

首页 1 2 3 4 5 6 7

一般数据存储方式

  • 文件读写,仅支持四种数据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, -, &stmt, nil);
    // 单步执行语句
    // 判断如果有数据,就执行语句
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        // 根据数据类型获取数据,第一个参数是语句管理者,第二个参数是第几列
        int ID = sqlite3_column_int(stmt, );
        const unsigned char *nameText = sqlite3_column_text(stmt, );
        // 把获取到的C语言的字符串转成OC的字符串
        NSString *name = [NSString stringWithUTF8String:(const char *)nameText];
        int age = sqlite3_column_int(stmt, );
        NSLog(@"ID=%d,name=%@,age=%d",ID,name,age);
    }
    // 释放sql语句管理者
    sqlite3_finalize(stmt);
}