对于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(, , )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(, , ) 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, -, &stmt, NULL) == SQLITE_OK) {
//查询数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
//获取表数据的内容
NSString * name = [NSString stringWithCString:(const char *)sqlite3_column_text(stmt, ) encoding:NSUTF8StringEncoding]; NSLog(@"name = %@",name); NSUInteger age = sqlite3_column_int(stmt, ); 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 = ; i < ; i ++) { NSString * sql =[NSString stringWithFormat: @"insert into t_sss (name,age) values ('%@',%zd);",@"别昱枢",arc4random_uniform()];
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 = ; i < ; 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 = ; i < ; 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

SQLite浅析的更多相关文章

  1. java sqlite配置和自定义函数

    资源 jetty Jetty Downloads地址 sqlite sqlite JDBC Driver 地址:bitbucket代码托管 和 Github代码托管 jetty配置sqlite 在je ...

  2. 浅析SQLite的锁机制和WAL技术

    锁机制 SQLite基于锁来实现并发控制.SQLite的锁是粗粒度的,并不拥有PostgreSQL那样细粒度的行锁,这也使得SQLite较为轻量级.当一个连接要写数据库时,所有其它的连接都被锁住,直到 ...

  3. Android开发学习之SQLite数据存取浅析

    一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...

  4. Sqlite注入测试

    测试了一个网站是Sqlite数据库,还装有安全狗,绕过了防护,找到Payload,写了一个Python脚本来跑表,这里总结一下: 取得sqlite数据库里所有的表名 查询table,type 段是't ...

  5. MVC框架浅析(基于PHP)

    MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...

  6. 内存管理 & 内存优化技巧 浅析

    内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...

  7. GreenDao开源ORM框架浅析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011133213/article/details/37738943 Android程序开发中,避免 ...

  8. 沉淀,再出发:docker的原理浅析

    沉淀,再出发:docker的原理浅析 一.前言 在我们使用docker的时候,很多情况下我们对于一些概念的理解是停留在名称和用法的地步,如果更进一步理解了docker的本质,我们的技术一定会有质的进步 ...

  9. [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. Web APi之过滤器创建过程原理解析【一】(十)

    前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把[筛子],那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从 ...

  2. Windows 搭建 .NET 跨平台环境并运行应用程序

    写在前面 阅读目录: Install .NET Version Manager (DNVM) Install .NET Core Execution Environment (DNX) Write t ...

  3. Google Chrome 应用商店上传扩展程序

    1. 进入 Google 开发者中心 网址: https://chrome.google.com/webstore/developer/dashboard?hl=zh-cn 2. 添加新项 上传后,出 ...

  4. weight属性你用的真的6嘛?

    相信大家在日常开发中一定使用过weight这个属性,它的作用一个是权重,另一个就是渲染优先级,但是你真的能很6的使用它嘛?如果不是,那么请继续往下看!!! 我们知道,当weight起到不同作用的时候, ...

  5. Macaca自动化测试之Android测试

    Macaca PC端 Web自动化测试非常类似于Selenium,而移动端自动化测试非常类似于Appium,如果你搭建过Appium环境,Macaca移动端环境的搭建将非常简单. 本文继承上一篇,关于 ...

  6. Cesium应用篇:3控件(5)CesiumInspector

    CesiumInspector控件并不是带来太多功能上的,但对开发人员来说,对于了解Cesium的渲染效果以及性能调优,还是一个很有价值的控件,特别是一些渲染状态下的问题,采用该控件,应该还是会有很多 ...

  7. 浅谈2D游戏设计模式2- WZ文件详解(UI.WZ)之MapLogin.img(1)

    玩过冒险岛的人都知道有一个WZ文件,那么这个WZ文件的内部是怎么样的呢,今天我就带大家一探究竟. 说实在的,我这是第一次接触WZ文件,但是却让我很震撼,为什么很震撼,因为这个居然是用VS2010写的! ...

  8. mininet和ryu控制器的连接

    1.执行ryu应用程式:ryu-manager --verbose ryu.app.simple_switch_13 2.启动mininet,配置如下:创建3个host,1个交换器(open vSwi ...

  9. 【原创】技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)

    1.前言 作为应用层开发人员,接触最多的网络协议通常都是传输层的TCP(与之同处一层的另一个重要协议是UDP协议),但对于IP协议,对于应用程序员来说更多的印象还是IP地址这个东西,再往深一点也就很难 ...

  10. 不在 sudoers 文件中。此事将被报告。

    使用Linux,初学使用root不要太方便,工作中却不会给你这样的,必须要用自己的账号.新账号需要添加sudo的权限. su 使用root登陆 visudo 在root下添加自己的用户名 root A ...