SQLite数据库

作者: NeverMore奈文摩尔 | 来源:发表于2016-03-07 20:05 被阅读280次

    在学习SQLite之前,首先了解下数据持久化的几种方式:

    定义:数据持久化是通过文件将数据存储在磁盘上

    IOS下主要有四种数据持久化的方式:
    1.属性列表Plist(通过将数组和字典写入一个文件进行存储,自定义的对象不能使用属性列表写入文件)
    2.偏好设置Preference(NSUserDefaults,也是只能存数组和字典等简单数据)
    2.对象归档(将自定义的对象写入文件)
    3.SQLite数据库(纯C语言,轻量级)
    4.CoreData(基于SQLite,OC版本,重量级)

    持久化方式的对比:
    1.属性列表,对象归档适合小数据量存储和查询操作(如果数据比较大,缺点:消耗内存,查询性能不好)
    2.SQLite,CoreData适合大数据量存储和查询操作

    数据库介绍
    数据库(Database)是按照数据结构来组织,存储和管理数据的仓库
    数据库管理系统是一种操纵和管理数据库的大型软件,用于建立,使用和维护数据库,常见的关系数据库管理系统有:
    Oracl(甲骨文,一些大的企业级的软件都用Orcal开发数据)
    MSSQLServer(微软的系统,用.Net开发的一个系统)
    DB2(IBM开发的数据管理系统)
    MySQL(一般是跟php组合使用,已被甲骨文收购)

    数据库可以分为两大类:
    1.关系型数据库(主流)
    2.对象型数据库

    SQLite介绍
    SQLite是一种轻型的数据库,是一种关系型数据库管理系统,它的设计目的是嵌入式设备中使用(手机中)
    SQLite占用资源很低,可能只需要哦几百K的内存就够了
    SQLite的处理速度比Mysql,PostgreSQL这两款著名的数据库都快
    SQLite占用资源非常低,非常适合移动设备中使用,而且是开源免费的
    SQLite第一个版本诞生于2000年5月,现在已经更新到SQLite3版本
    SQLite数据库是通过建表来存储数据的,表和表之间可以建立关系,所以叫关系型数据库

    基础的SQL语句

    SQL语句用于对数据进行存储,查询,更新等管理操作
    1.创建表

    CREATE TABLE Class99 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL)
    

    2.插入一条数据

    INSERT INTO Class99(Stu_ID,name,gender,age) VALUES(?,?,?,?)
    

    3.更新一条数据

    UPDATE Class99 SET gender = ? WHERE Stu_ID = ? 
    

    4.删除一条数据

    DELETE FROM Class99 WHERE Stu_ID = ?
    

    5.查询一条数据

    SELECT * FROM Class99 WHERE Stu_ID = ?
    

    数据库操作流程

    SQLite最新版本是3.0,使用前需要导入libsqlite3.0dylib
    操作流程:
    1.打开数据库
    2.编译SQL语句
    3.执行SQL语句,读取数据
    4.语句完结
    5.关闭数据库

    SQL常用参数

    1.sqlite3_open()     //打开数据库
    2.sqlite3_close()     //关闭数据库
    3.sqlite3_exec()     //执行sql语句,例如创建表
    4.sqlite3_prepare_v2()    //编译SQL语句
    5.sqlite3_step()    //执行sql语句
    6.sqlite3_finaliza()    //结束sql语句
    7.sqlite3_bind_text()   //绑定参数
    8.sqlite3_column_text()    //查询字段上的数据
    

    下面新建一个工程,使用以上SQLite的函数以及操作流程:

    1.首先,给工程里面导入libsqlite3.tbd:

    1.png

    2.然后,使用storyboard,分别添加一下Button,关联到ViewController里面:


    2.png

    3. 新建一个类,声明这个类的属性,这个相当于建表

    
    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject
    
    @property(nonatomic,strong)NSString *name;
    
    @property(nonatomic,strong)NSString *gender;
    
    @property(nonatomic,assign)int age;
    
    @property(nonatomic,assign)int Stu_ID;
    
    -(instancetype)initWithName:(NSString *)name andAge:(int)age andGender:(NSString *)gender andStuID:(int)stu_ID;
    
    
    
    
    @end
    
    @implementation Student
    
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    
    
    }
    
    -(NSString *)description{
    
        return [NSString stringWithFormat:@"%@",_name];
    }
    
    //自定义初始化方法
    -(instancetype)initWithName:(NSString *)name andAge:(int)age andGender:(NSString *)gender andStuID:(int)stu_ID{
        
        if (self = [super init]) {
            
            _name = name;
            _age = age;
            _gender = gender;
            _Stu_ID = stu_ID;
            
            
        }
        
        return self;
    }
    
    
    
    
    
    @end
    

    4.这里我们通过用单例来声明方法,然后在控制器里调用这些方法
    这里结合SQLite的基础语句来声明这些方法:

    #import <Foundation/Foundation.h>
    @class Student;
    @interface DataBase : NSObject
    
    //创建单例
    +(instancetype)shareDatabase;
    
    //打开数据库
    -(void)openDB;
    
    //关闭数据库
    -(void)closeDB;
    
    //添加
    -(void)insertStudent:(Student *)stu;
    
    //删除
    -(void)deleteStudent:(int)stu_ID;
    
    //修改
    -(void)updateStudentgender:(NSString *)gender andStuID:(int)stu_id;
    
    //查询所有
    -(NSArray *)selectAllStudents;
    
    //查询单个
    -(Student *)selectStudengWithID:(int)stu_id;
    
    
    
    @end
    

    ****在.m里实现这些方法:***
    首先在.m里导入数据库,并且创建单例:

    #import "DataBase.h"
    #import <sqlite3.h>
    #import "Student.h"
    
    @implementation DataBase
    static DataBase *dataBase  = nil;
    
    +(instancetype)shareDatabase{
        //加锁
        @synchronized(self) {
            
            if (nil == dataBase) {
                dataBase = [[DataBase alloc] init];
                //打开数据库
                [dataBase openDB];
            }
            
        }
       
    
        return dataBase;
    }
    
    //创建数据库对象
    static sqlite3 *db = nil;
    
    

    ***打开数据库和关闭数据库:****

    //打开数据库
    -(void)openDB{
      
      //如果数据库已经打开,则不需要执行后面的操作
      if (db != nil) {
          return;
      }
      
    
      //创建保存数据库的路径
      NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) firstObject];
      documentPath = [documentPath stringByAppendingString:@"/LOClass.sqlite"];
      
      NSLog(@"%@",documentPath);
      //打开数据库 (如果该数据库存在,则直接打开,否则自动创建一个再打开)
      int result = sqlite3_open([documentPath UTF8String], &db);
      if (result == SQLITE_OK) {
          NSLog(@"成功打开");
          //建表
          //准备sql语句
          NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";
          //执行sql语句
          sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL);
          
      }else{
          NSLog(@"%d",result);
      }
      
      
    
    }
    
    //关闭数据库
    -(void)closeDB{
      int result = sqlite3_close(db);
      if (result == SQLITE_OK) {
          NSLog(@"关闭成功");
          //关闭数据库的时候,将db置为空,是因为打开数据库的时候,我们需要使用nil来判断
          db = nil;
          
          
      }else{
          
          NSLog(@"关闭失败:%d",result);
          
      }
     
    
    }
    
    

    实现添加

    //添加
    -(void)insertStudent:(Student *)stu{
    
        //1.打开数据库
        [self openDB];
    
        //2.创建跟随指针
        sqlite3_stmt *stmt = nil;
        //3.准备sqlite语句
         NSString *sql = @"INSERT  INTO CLASS43(Stu_ID,name,gender,age) VALUES(?,?,?,?)";
        //4.验证sql语句的正确性
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
        
        //5.  执行
        if (result == SQLITE_OK) {
            
            NSLog(@"数据库添加成功");
            //一旦sql语句没有问题,就要开始绑定数据,替换?
            //(1)跟随指针  (2)问号的顺序(从1开始)  (3)要绑定的值
            sqlite3_bind_int(stmt, 1, stu.Stu_ID);
            sqlite3_bind_text(stmt, 2, [stu.name UTF8String], -1, nil);
            sqlite3_bind_text(stmt, 3, [stu.gender UTF8String], -1, nil);
            sqlite3_bind_int(stmt, 4, stu.age);
            
            //6单步执行q
            sqlite3_step(stmt);
            
            
            
            
        }else{
        
            NSLog(@"数据库添加失败:%d",result);
        }
        
        //7 释放跟随指针占用的内存
        sqlite3_finalize(stmt);
     
    }
    
    

    我们可以 通过打开数据库里的方法中的路径,去查询数据:
    在finder中前往文件夹,会找到后缀.sqlite的文档,通过SQLiteManager(一种管理数据的工具)打开,可以看到代码中的数据成功添加了:

    3.png

    删除

    
    //删除
    -(void)deleteStudent:(int)stu_ID{
    
        //1.打开数据库
        [self openDB];
        
        //2.创建跟随指针
        sqlite3_stmt *stmt = nil;
        //3.准备sql语句
        NSString *sql = @"DELETE FROM Class43 WHERE Stu_ID=?";
    
        //4.验证sql正确性
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
    
        //5.
        if (result == SQLITE_OK) {
            NSLog(@"删除成功");
            //开始绑定
            sqlite3_bind_int(stmt, 1, stu_ID);
            
            //执行
            sqlite3_step(stmt);
            
            
        }else{
        
        
            NSLog(@"删除失败%d",result);
        }
    
    //7.释放内存
        sqlite3_finalize(stmt);
    
    
    }
    

    修改

    //修改
    -(void)updateStudentgender:(NSString *)gender andStuID:(int)stu_id{
    
        [self openDB];
        
        sqlite3_stmt *stmt = nil;
        
        NSString *sql = @"UPDATE Class43 SET gender = ? WHERE Stu_ID = ?";
        
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            NSLog(@"修改成功");
            
            //绑定  (绑定的是问号)  (1和2 代表问号)
            sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, NULL);
            
            sqlite3_bind_int(stmt, 2, stu_id);
            
            sqlite3_step(stmt);
            
            
        }else{
            NSLog(@"修改失败");
        }
        
    
        sqlite3_finalize(stmt);
        
        
    }
    

    查找

    
    -(NSArray *)selectAllStudents{
        
        //1.打开数据库
        [self openDB];
        //2.跟随指针
        sqlite3_stmt *stmt = nil;
        //3.
        NSString *sql = @"SELECT * FROM Class43";
        //4.验证
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
        if (result == SQLITE_OK) {
            //创建可变数组,用来存放查询到的学生
            NSMutableArray *array = [NSMutableArray array];
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                //根据sql语句,将搜索到的符合条件的值取出来
                //0代表数据库表的第一列
                int stu_id = sqlite3_column_int(stmt, 0);
                NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
                NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
                int age = sqlite3_column_int(stmt, 3);
                
                //将取出来的信息赋值给学生模型
                Student *stu = [[Student alloc] initWithName:name andAge:age andGender:gender andStuID:stu_id];
                
                //将学生添加到可变数组里面
                [array addObject:stu];
                
            }
            
            sqlite3_finalize(stmt);
            return array;
            
            
        }else{
            NSLog(@"查询失败:%d",result);
        }
        
        sqlite3_finalize(stmt);
        
        return nil;
    }
    
    -(Student *)selectStudengWithID:(int)stu_id{
    
        //1.
        [self openDB];
    //2.
        sqlite3_stmt *stmt = nil;
    //3.
    NSString *sql = @"SELECT * FROM Class43 WHERE Stu_ID= ?";
        
      //4.
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, NULL);
        //5
        if (result == SQLITE_OK) {
            
            //绑定
            sqlite3_bind_int(stmt, 1, stu_id);
            //执行
            Student *stu = [Student new];
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                
                int stu_id = sqlite3_column_int(stmt, 0);
                NSString *name  = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 1)];
                NSString *gender = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(stmt, 2)];
                int age = sqlite3_column_int(stmt, 3);
                
                stu.Stu_ID = stu_id;
                stu.name = name;
                stu.age = age;
                stu.gender = gender;
            }
            sqlite3_finalize(stmt);
            return stu;
            
        }else{
            NSLog(@"查询失败%d",result);
        }
        sqlite3_finalize(stmt);
    
        return nil;
    }
    

    5.在关联的控制器里调用这些方法

    
    - (void)viewDidLoad {
        [super viewDidLoad];
        DataBase *db = [DataBase shareDatabase];
        
       // [db closeDB];
        
        
        
    }
    
    - (IBAction)inserBtn:(UIButton *)sender {
        NSLog(@"添加");
        Student *stu = [Student new];
        stu.Stu_ID = 1;
        stu.name = @"影魔";
        stu.gender = @"sf";
        stu.age = 100;
        
        Student *stu1 = [[Student alloc] initWithName:@"大队长" andAge:25 andGender:@"女" andStuID:2];
        Student *stu2 = [[Student alloc] initWithName:@"爱君" andAge:18 andGender:@"女" andStuID:3];
        Student *stu3 = [[Student alloc] initWithName:@"屠夫" andAge:99 andGender:@"男" andStuID:4];
        
        
        DataBase *db = [DataBase shareDatabase];
        [db insertStudent:stu];
        [db insertStudent:stu1];
        [db insertStudent:stu2];
        [db insertStudent:stu3];
      
    }
    
    
    - (IBAction)deleteBtn:(UIButton *)sender {
         NSLog(@"删除");
        
        DataBase *db = [DataBase shareDatabase];
        [db deleteStudent:4];
        
        
        
        
        
    }
    
    - (IBAction)searchBtn:(UIButton *)sender {
         NSLog(@"查询所有");
        
        DataBase *da = [DataBase shareDatabase];
      
        NSArray *array = [da selectAllStudents];
        NSLog(@"%@",array);
        
        
        
        
    }
    
    
    - (IBAction)oneSearchBtn:(UIButton *)sender {
         NSLog(@"查询单个");
        DataBase *db = [DataBase shareDatabase];
        Student *stu = [db selectStudengWithID:1];
        NSLog(@"%@",stu);
        
        
        
    }
    
    
    
    - (IBAction)changeBtn:(UIButton *)sender {
        NSLog(@"修改");
        
        DataBase *db = [DataBase shareDatabase];
        
        [db updateStudentgender:@"nv" andStuID:4];
        
    }
    

    由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android、iPhone都有内置的SQLite数据库供开发人员使用,它的易用性可以加快应用程序的开发,并使得复杂的数据存储变得轻松了许多。

    相关文章

      网友评论

        本文标题:SQLite数据库

        本文链接:https://www.haomeiwen.com/subject/vqonkttx.html