数据存储之SQLite

简介:

SQLite这部分玩过数据库的只要学习一下常用的函数以及用法,SQL语法这块基本都差不多了解一下基本OK。以前做C#,对数据库还是蛮自信的。

一、SQLite使用准备

添加框架、引入头文件

二、SQLite 例子 


//
//  ViewController.m
//  SQLite
//
//  Created by cyw on 15-4-25.
//  Copyright (c) 2015年 cyw. All rights reserved.
//
 
#import "ViewController.h"
#import <sqlite3.h>
 
@interface ViewController ()
@property(nonatomic,assign)sqlite3 *db;
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
     
    //指定数据库路径,存放位置
    NSString *documentPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filePath=[documentPath stringByAppendingPathComponent:@"CYW.sqlite"];
    NSLog(@"%@",filePath);
//    sqlite3是一种类型,db是数据库的句柄,就是数据库的象征,如果要进行增删改查,就得操作db这个实例
     
     
//    打开数据库
//    SQLITE_API int sqlite3_open(
//    const char *filename,     /* Database filename (UTF-8) */
//    sqlite3 **ppDb            /* OUT: SQLite db handle */
//    );
//    参数1:数据库路径名 参数类型const char 所以要将oc字符串转换一下  文件不存在时自动创建
//    参数2:数据库句柄
//    返回int类型:表示打开数据库成功失败 SQLITE_OK打开成功 否则失败
    int result=sqlite3_open(filePath.UTF8String, &_db);
    if (result==SQLITE_OK) {
        NSLog(@"打开成功");
//        [self createTable];
//        [self insertData];
         
//        [self SelectData];
//        [self updateData];
//        [self deletaData];
//        [self insertImg];
        
//        UIImageView *ImgView=[[UIImageView alloc]initWithImage:[self showImage]];
//        ImgView.frame=CGRectMake(100, 100, 100, 100);
//        [self.view addSubview:ImgView];
        [self transition];
        
    }
    else
    {
        NSLog(@"打开失败");
    }
    sqlite3_close(_db);
}
//新建数据库表
-(void)createTable
{
    //sqlite支持以下几种数据类型
    //integer:整形值  real:浮点值 text:字符串 blob:二进制 NULL:空值
    const char *sql="create table if not exists Person(id integer primary key autoincrement ,age integer not null,name text not null,photo blob,registerTime DATETIME DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),sex char(1) default '0',money number(10,2),classId integer,constraint fk_Person_class foreign key (classId) references P_Class (CId));create table if not exists P_Class (CId integer primary key ,CName varchar(20));";
    char *errmsg=NULL;
    //执行sql语句
    sqlite3_exec(_db, sql, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"%s",errmsg);
        NSLog(@"新建表失败");
        }
    else
        {
           NSLog(@"新建表成功");
        }
     
}
// 新增数据
-(void)insertData
{
    //添加班级
    // NSMutableString *stringSql=[NSMutableString stringWithFormat:@"insert into P_Class values(%d,'%@');insert into Person(age,name,money,classId) values(%d,'%@',%lf,%d)",1001,@"软件一班",23,@"CuiYw",200.99,1001];
     
     
    NSString *stringSql=[NSMutableString stringWithFormat:@"insert into P_Class values(%d,'%@');",1001,@"软件一班"];
    NSString *personSql=[NSString stringWithFormat:@"insert into Person(age,name,money,classId) values(%d,'%@',%lf,%d);",23,@"CuiYw",200.99,1001];
    NSLog(@"%@",personSql);
    stringSql = [personSql stringByAppendingString:personSql];
    NSLog(@"%@",personSql);
     
    char *errmsg=NULL;
   //执行sql语句
    sqlite3_exec(_db, [stringSql UTF8String], NULL, NULL, &errmsg);
     
    if (errmsg) {
       NSLog(@"%s",errmsg);
       NSLog(@"新增数据失败");
        }
    else
        {
            NSLog(@"新增数据成功");
        }
}
//查询数据
-(void)SelectData
{
    // stringWithFormat:中%是转义字符,两个%才表示一个%
    NSString *selectSql=[NSString stringWithFormat:@"select id, age,name,money,photo from Person where name like '%%%@%%'",@"cuiyw"];
    sqlite3_stmt *stmt;
    //进行查询前的准备工作
    //第三个参数为sql的长度(如果设置为-1,则代表系统会自动计算sql语句的长度),第四个参数用来取数据,第五个参数为尾部一般用不上可直接写NULL
    if (sqlite3_prepare_v2(_db, [selectSql UTF8String], -1, &stmt, NULL) == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            int pId=sqlite3_column_int(stmt, 0);
            int age=sqlite3_column_int(stmt, 1);
           const unsigned char *name=sqlite3_column_text(stmt, 2);
            double money=sqlite3_column_double(stmt, 3);
            NSLog(@"%d %d %s %f ",pId,age,name,money);
            }
        }
    else
        {
            NSLog(@"error");
        }
}
//修改数据
-(void)updateData
{
     
    [self SelectData];
    //在执行sql语句时出现一个怪现象 模糊查询时能够不区分大小写 而在用=时就区分大小写这块很是郁闷, 在其他数据库中数据库默认是不区分的
    NSString *updSql=[NSString stringWithFormat:@"update Person set money=%f where name='%@'", 200.99, @"CuiYw"];
    NSLog(@"%@",updSql);
    char *errmsg=NULL;
    sqlite3_exec(self.db, updSql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"%s",errmsg);
        NSLog(@"更新数据库失败");
        }
    else
        {
           NSLog(@"%s", errmsg);
            NSLog(@"更新数据库成功");
        }
    [self SelectData];
}
//删除数据
-(void)deletaData
{
    NSString *delSql=[NSString stringWithFormat:@"delete from person where name='%@'",@"cuiyw"];
    NSLog(@"%@",delSql);
    char *errmsg=NULL;
    sqlite3_exec(self.db, delSql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"%s",errmsg);
        NSLog(@"删除数据库失败");
        }
    else
        {
             
            NSLog(@"删除数据库成功");
        }
    
}
//插入图片
-(void)insertImg
{
   char *sql="update Person set photo=? where id=1";
    UIImage *img=[UIImage imageNamed:@"Img.png"];
    NSData *data=UIImagePNGRepresentation(img);
     
    sqlite3_stmt *stmt;
    if (sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL) == SQLITE_OK) {
        sqlite3_bind_blob(stmt, 1, [data bytes], [data length], NULL);
        if (sqlite3_step(stmt)==SQLITE_DONE) {
            NSLog(@"插入图片成功");
        }
 
    }
    else
    {
        NSLog(@"error");
    }
    sqlite3_finalize(stmt);
}
//显示图片
-(UIImage *)showImage
{
    UIImage *Img=NULL;
    char *sql="select photo from Person where Id=1";
    sqlite3_stmt *stmt=NULL;
    if (sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL) == SQLITE_OK) {
        if (sqlite3_step(stmt)==SQLITE_ROW  ) {
            int bytes=sqlite3_column_bytes(stmt, 0);
            Byte * value = (Byte*)sqlite3_column_blob(stmt, 0);
              if (bytes !=0 && value != NULL)
              {
                  NSLog(@"aa");
                   NSData * data = [NSData dataWithBytes:value length:bytes];
                   Img = [UIImage imageWithData:data];
              }
 
        }
    }
    return Img;
}
//事务
//模拟转账操作 将两个账户的money一加一减
-(void)transition
{
    [self SelectData];
    float updateMoney=20.0;
    NSString *strsql1=[NSString stringWithFormat:@"update Person Set money=money+%f where id=%d;",updateMoney,1];
    NSString *strsql2=[NSString stringWithFormat:@"update Person Set money=money-%f where id=%d;",updateMoney,2];
    NSArray *arrayStr=[NSArray arrayWithObjects:strsql1,strsql2 ,nil];
    @try {
        char *errmsg=NULL;
        if (sqlite3_exec(self.db, "begin", NULL, NULL, &errmsg)==SQLITE_OK) {
            NSLog(@"开启事务");
            sqlite3_free(errmsg);
            sqlite3_stmt *stmt=NULL;
            //执行事务
            for (NSString *str in arrayStr) {
                NSLog(@"%@",str);
                if (sqlite3_prepare_v2(self.db, [str UTF8String], -1, &stmt, NULL)==SQLITE_OK) {
                    NSLog(@"bb");
                    if (sqlite3_step(stmt)!=SQLITE_DONE) {
                        sqlite3_finalize(stmt);
                    }
                }
            }
            //提交事务
            if (sqlite3_exec(self.db, "commit", NULL, NULL, &errmsg)==SQLITE_OK) {
                NSLog(@"提交事务");
                sqlite3_free(errmsg);
            }
        }
    }
    @catch (NSException *exception) {
        char *errmsg=NULL;
        if (sqlite3_exec(self.db, "rollback", NULL, NULL, &errmsg)==SQLITE_OK) {NSLog(@"回滚事务");}
    }
    @finally {
        [self SelectData];
    }
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
@end

相关文章
|
8天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
12天前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
75 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
9天前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
10天前
|
JSON 前端开发 Java
数据库中的时间和前台展示的时间不一样,如何保存日期格式的数据到数据库? 如何展示数据库的日期数据到前台
这篇文章讨论了前端展示时间和数据库时间不一致的问题,并提供了解决方法,包括在SpringBoot的`application.properties`中配置时区和日期格式,以及如何将日期数据格式化后保存到数据库中。
数据库中的时间和前台展示的时间不一样,如何保存日期格式的数据到数据库? 如何展示数据库的日期数据到前台
|
1天前
|
SQL 存储 小程序
【教程】navicat配合HTTP通道远程连接SQLite数据库
本文介绍了如何通过 Navicat Premium 工具配合 n_tunnel_sqlite.php 和 HTTP 通道远程连接服务器上的 SQLite 数据库。SQLite 是一种自给自足的、无服务器的 SQL 数据库引擎,由于其端口未对外开放,直接使用 Navicat 进行远程连接不可行。文章详细记录了使用 HTTP 通道实现远程连接的过程,包括定位本地 `ntunnel_sqlite.php` 文件,将其上传至服务器,并通过 Navicat 配置 HTTP 通道连接 SQLite 数据库的具体步骤。
6 0
【教程】navicat配合HTTP通道远程连接SQLite数据库
|
7天前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
9天前
|
安全 Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+jsp实现的健身房管理系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术实现的健身房管理系统。随着健康生活观念的普及,健身房成为日常锻炼的重要场所,高效管理会员信息、课程安排等变得尤为重要。该系统旨在通过简洁的操作界面帮助管理者轻松处理日常运营挑战。技术栈包括:JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Shiro、Spring Boot 2.0等。系统功能覆盖登录、会员管理(如会员列表、充值管理)、教练管理、课程管理、器材管理、物品遗失管理、商品管理及信息统计等多方面。
|
6天前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
9天前
|
Java 数据库连接 数据库
java系列之~如何给sqlite数据库添加表
这篇文章介绍了如何在Java中使用SQLite JDBC驱动来连接SQLite数据库,并提供了示例代码来演示如何创建一个新的数据库表。

热门文章

最新文章

下一篇
云函数