数据存储之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

相关文章
|
20天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
163 0
|
22天前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
1月前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
【2月更文挑战第23天】【2月更文挑战第73篇】如何处理爬取到的数据,例如存储到数据库或文件中?
|
1月前
|
SQL 开发框架 JavaScript
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
41 3
|
1月前
|
存储 数据管理 数据处理
数据之光:探索数据库技术的演进之路
数据之光:探索数据库技术的演进之路
59 1
|
1月前
|
存储 运维 关系型数据库
数据的力量:构筑现代大型网站之数据库基础与应用
数据的力量:构筑现代大型网站之数据库基础与应用
46 0
|
25天前
|
SQL Java 数据库连接
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
17 0
|
1月前
|
NoSQL Java 数据库连接
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
使用Java实现从数据库查出数据存入Redis,并在查询时先查Redis,如果Redis中没有数据再从数据库中读取
267 1
|
2天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
5天前
|
人工智能 Cloud Native 算法
数据之势丨AI时代,云原生数据库的最新发展趋势与进展
AI与云数据库的深度结合是数据库发展的必然趋势,基于AI能力的加持,云数据库未来可以实现更快速的查询和决策,帮助企业更好地利用海量数据进行业务创新和决策优化。
数据之势丨AI时代,云原生数据库的最新发展趋势与进展

热门文章

最新文章