SQLite浅析

对于iOS工程师有一道常考的面试题,即iOS数据存储的方式

标答如下:

Plist(NSArray\NSDictionary)

Preference (偏好设置\NSUserDefaults)

NSCoding(NSKeyed Archiver\NSkeyedUnarchiver)

SQLite3

Core Data


今天就跟大家分享一下,SQLite3的基础知识

什么是SQLite

SQLite 是一款轻型的嵌入式关系型数据库,

它速度要强于Mysql,PostgreSQL,而且占用资源少,在嵌入式设备中可能只需要几百K的内存。

下面是创建该数据库的demo(备注我们需要导入libsqlite3.0.tbd的库)

#import "ViewController.h"
#import <sqlite3.h>
@interface ViewController ()

@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *filename=[[NSSearchPathForDirectoriesInDomains(13, 1, 1)lastObject]stringByAppendingPathComponent:@"newsqlite.sqlite"];
    // Do any additional setup after loading the view, typically from a nib.
    sqlite3 *database=nil;
    //打开数据库,如果数据库不存在就创建
    if( sqlite3_open(filename.UTF8String,&database)==SQLITE_OK)
    {
        NSLog(@"打开成功");
        /**
         *  如果存在就无需创建
         */
        char *errmsg;
    NSString *sql=@"create table if not exists t_student(id integer primary key autoincrement,name text,age integer);";
        sqlite3_exec(database, sql.UTF8String, NULL, NULL, &errmsg);
        if(errmsg)
        {

            NSLog(@"创建表失败");

        }else{NSLog(@"创建表成功");

        }
        /**
         *  关闭数据库
         */
        sqlite3_close(database);
    }
    else{
        NSLog(@"打开数据库失败");
    }

}

@end

为了简便,我们把获取沙盒路径封装的类别里代码如下

NSString+Tool.h
#import <Foundation/Foundation.h>

@interface NSString (Tool)

+(NSString * )cachaPathName:(NSString *)fileName;

@end
NSString+Tool.m
#import "NSString+Tool.h"

@implementation NSString (Tool)

+(NSString * )cachaPathName:(NSString *)fileName{

    return [[NSSearchPathForDirectoriesInDomains(13, 1, 1) lastObject] stringByAppendingPathComponent:fileName];
}

@end

然后我们来实现一下,数据库中的增删改查四种操作

用故事板拖四个按钮分别是增删改查,在按钮的方法实现中实现对表的增删改查

#import "ViewController.h"
#import <sqlite3.h>
#import "NSString+Tool.h"

static     sqlite3 * dataBase = nil;

@interface ViewController ()

@property (nonatomic ,copy) NSString * filename;

@end

@implementation ViewController
- (IBAction)selectAction:(id)sender {

    //1.打开数据库
    if (sqlite3_open(self.filename.UTF8String,&dataBase) == SQLITE_OK) {

        //2.执行查询语句
        //准备查询

        NSString * sql = @"select * from t_sss;";

        //查询句柄
        sqlite3_stmt * stmt;

        if (sqlite3_prepare(dataBase, sql.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
            //查询数据
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                //获取表数据的内容
                NSString * name =  [NSString stringWithCString:(const char *)sqlite3_column_text(stmt, 1) encoding:NSUTF8StringEncoding];

                NSLog(@"name = %@",name);

                NSUInteger age = sqlite3_column_int(stmt, 2);

                NSLog(@"age = %zd",age);

            }
        }

        //3.关闭数据库
        sqlite3_close(dataBase);
    }

}

- (IBAction)insertAction:(id)sender {

    //1.打开数据库
    if (sqlite3_open(self.filename.UTF8String,&dataBase) == SQLITE_OK) {

        //2.执行插入语句
        for (int i = 0; i < 100; i ++) {

            NSString * sql =[NSString stringWithFormat: @"insert into t_sss (name,age) values (‘%@‘,%zd);",@"别昱枢",arc4random_uniform(100)];
            char * errmsg;
            sqlite3_exec(dataBase, sql.UTF8String, NULL, NULL, &errmsg);
            if (errmsg) {
                NSLog(@"插入失败");
            }else{
                NSLog(@"插入成功");
            }
            //3.关闭数据库
            sqlite3_close(dataBase);
        }

    }

}
- (IBAction)deleteAction:(id)sender {

    //1.打开数据库
    if (sqlite3_open(self.filename.UTF8String,&dataBase) == SQLITE_OK) {

        //2.执行插入语句
        for (int i = 0; i < 100; i ++) {

            NSString * sql =@"delete from t_sss where name = ‘gaga‘;";
            char * errmsg;
            sqlite3_exec(dataBase, sql.UTF8String, NULL, NULL, &errmsg);
            if (errmsg) {
                NSLog(@"删除失败");
            }else{
                NSLog(@"删除成功");
            }
            //3.关闭数据库
            sqlite3_close(dataBase);
        }

    }

}
- (IBAction)updateAction:(id)sender {

    //1.打开数据库
    if (sqlite3_open(self.filename.UTF8String,&dataBase) == SQLITE_OK) {

        //2.执行更新语句
        for (int i = 0; i < 100; i ++) {

            NSString * sql =@"update  t_sss set name = ‘gaga‘ where age > 50;";

            char * errmsg;
            sqlite3_exec(dataBase, sql.UTF8String, NULL, NULL, &errmsg);
            if (errmsg) {
                NSLog(@"更新失败");
            }else{
                NSLog(@"更新成功");
            }
            //3.关闭数据库
            sqlite3_close(dataBase);
        }

    }

}

- (void)viewDidLoad {

    [super viewDidLoad];

    NSString * filename = [NSString cachaPathName:@"sss.sqlite"];

    self.filename = filename;

    NSLog(@"%@",filename);

    //操作sqlite3

    //打开数据库,如果不存在就创建
    //arg1:数据库的沙盒存放地址
    //arg2:数据库的地址,也可以叫句柄

    if (sqlite3_open(filename.UTF8String, &dataBase) == SQLITE_OK)
    {
        NSLog(@"数据库打开成功");
        //建表,如果存在表就不建
        NSString * sql = @"create table if not exists t_sss (id integer primary key autoincrement , name text, age integer);";

        //执行数据库语句
        char * errmsg;
        sqlite3_exec(dataBase, sql.UTF8String, NULL, NULL,&errmsg);

        if (errmsg) {
            NSLog(@"创建表失败");
        }else{
            NSLog(@"创建表成功");
        }

        //关闭数据库
        sqlite3_close(dataBase);

    }else{
        NSLog(@"数据库打开失败");
    }
}

@end

细心的同学可以看出增删改的操作相似,所以我们封装一下

SqliteManager.h
#import <Foundation/Foundation.h>

@interface SqliteManager : NSObject

+(BOOL) sqlite3WithSql :(NSString *)sql;

@end
SqliteManager.m
#import "SqliteManager.h"
#import "NSString+Tool.h"
#import <sqlite3.h>

static     sqlite3 * dataBase = nil;

@interface BYSSqliteManager ()

@property (nonatomic ,copy) NSString * filename;

@end

@implementation BYSSqliteManager

+(BOOL) sqlite3WithSql :(NSString *)sql{
    return NO;
}

+(void)initialize{

    NSString * filename = [NSString cachaPathName:@"sss.sqlite"];

    NSLog(@"%@",filename);

    //操作sqlite3

    //打开数据库,如果不存在就创建
    //arg1:数据库的沙盒存放地址
    //arg2:数据库的地址,也可以叫句柄

    if (sqlite3_open(filename.UTF8String, &dataBase) == SQLITE_OK)
    {
        NSLog(@"数据库打开成功");
        //建表,如果存在表就不建
        NSString * sql = @"create table if not exists t_sss (id integer primary key autoincrement , name text, age integer);";

        //执行数据库语句
        char * errmsg;
        sqlite3_exec(dataBase, sql.UTF8String, NULL, NULL,&errmsg);

        if (errmsg) {
            NSLog(@"创建表失败");
        }else{
            NSLog(@"创建表成功");
        }

        //关闭数据库
        sqlite3_close(dataBase);

    }else{
        NSLog(@"数据库打开失败");
    }
}

@end
时间: 2024-10-02 04:42:15

SQLite浅析的相关文章

Android开发学习笔记:数据存取之SQLite浅析

一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的

浅析SQLite数据库开发常用管理工具

SQLite数据库开发主要面向手机以及其他移动设备.一般对于SQLite数据库开发,很多开发人员并不陌生.这里将介绍几个SQLite数据库开发的的实用工具,希望对大家有所帮助. 虽然说一直在用Sql Server2000和2005开发项目,但是某些时候想开发一些小的应用程序,用这种数据库就不合适了,想想可以用ACCESS做数据库, 但是一直觉得ACCESS是过去的东西,和C#不是很搭配.所以就在网上搜索了一下,发现有一个SQLite是支持.NET开发的绿色数据库,直接一个System.Data.

浅析SQLite数据库(基础教学)

SQLite采用动态数据类型,可以跨平台使用,不像CoreData是苹果专用的:先介绍一下在Xcode中的简单使用: 先连接数据库如图: 然后引入头文件#import <sqlite3.h> 代码开始前先介绍一下sq语句: //1.创建表语法:create table 表名(字段1 类型 约束1 约束2, 字段2 类型 约束1 约束2);create table if not exists 表名(字段1 类型 约束1 约束2, 字段2 类型 约束1 约束2);//事例:需求:创建一个stude

浅析SQLite的锁机制和WAL技术

锁机制 SQLite基于锁来实现并发控制.SQLite的锁是粗粒度的,并不拥有PostgreSQL那样细粒度的行锁,这也使得SQLite较为轻量级.当一个连接要写数据库时,所有其它的连接都被锁住,直到写连接结束它的事务. SQLite的数据库连接有5种状态: 状态 对应的锁 未加锁 — 共享(shared) 共享锁  预留(reserved) 预留锁 未决(pending) 未决锁 排它(exclusive) 排它锁 SQL使用锁逐步提升机制,上面的表格从上到下,对应锁的等级逐步提升,等级越高权

GreenDao开源ORM框架浅析

Android程序开发中,避免不了要用到数据库,我们都知道android提供了内置的Sqlite,即调用SQLiteOpenHelper的方法,来操作数据库,但是使用过程较为繁琐,从建表到对表中数据的正删改查操作,需要大量的代码来建立表,和完成这些操作. GreenDao居然是ORM框架,它跟hibernate是很像的,就是当你配置了一些参数信息之后,可以由框架来帮你生成对应的实体类,还有生成对应的操作实体类的代码(自动建表和基本的增删改查). 优点: 1.最大性能(最快的Android ORM

Android Cursor浅析

1. 本文目的 Android ContentProvider提供了进程间数据交换的一种机制.而数据库的查询就是这种机制的应用.那么app通过Uri查询数据库而得到的Cursor究竟是个什么东西?为何可以为我们提供另一个进程的数据?本文以getContentResolver().query(--)函数为起点,全面分析Cursor家族关系类图,理清Cursor跨进程通信的机制. 1.1 客户端的Cursor对象 假设B进程中有一个ContentProvider,A进程通过Uri查询这个Conten

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

H5缓存机制浅析-移动端Web加载性能优化【干货】

转载:H5缓存机制浅析-移动端Web加载性能优化[干货] 作者:贺辉超,腾讯游戏平台与社区产品部 高级工程师 目录 1 H5缓存机制介绍 2 H5缓存机制原理分析 2.1 浏览器缓存机制 2.2 Dom Storgage(Web Storage)存储机制 2.3 Web SQL Database存储机制 2.4 Application Cache(AppCache)机制 2.5 Indexed Database (IndexedDB) 2.6 File System API 3 移动端Web加载

Sqlite注入测试

测试了一个网站是Sqlite数据库,还装有安全狗,绕过了防护,找到Payload,写了一个Python脚本来跑表,这里总结一下: 取得sqlite数据库里所有的表名 查询table,type 段是'table',name段是table的名字, so: select name from sqlite_master where type='table' order by name; 查询一条记录:select name from sqlite_master where type='table' or