SQLite数据库

在学习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:

SQLite数据库_第1张图片
1.png

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


SQLite数据库_第2张图片
2.png

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


#import 

@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 
@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 
#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(一种管理数据的工具)打开,可以看到代码中的数据成功添加了:

SQLite数据库_第3张图片
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数据库)