对于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. 爬虫技术 -- 进阶学习(十一)【补充】获取html中meta标签中的content的内容

    上一篇网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp中提及了很多如何快速抓取html中的文本的语句, 但是meta标签中的content内容的抓取,没有提及到! ...

  2. WebAPi添加常用扩展方法及思维发散

    前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...

  3. ECMAScript5之Array

    在ECMAScript5中对Array新增的些方法,以前没注意的同志们,嘻嘻,下面我们一起来边看边学. 1.Array之isArray(element) 看到isArray,不言而喻,就是判断一个对象 ...

  4. 搭建GoldenGate的单向复制环境

    配置环境: 建议在相同版本OGG(即Oracle GoldenGate)之间进行复制,我在这里之所以选择不同版本的OGG,便于后续的比较学习. 一.准备OGG的运行用户 在这里,我直接使用oracle ...

  5. C# 将PowerPoint文件转换成PDF文件

    PowerPoint的优势在于对演示文档的操作上,而用PPT查看资料,反而会很麻烦.这时候,把PPT转换成PDF格式保存,再浏览,不失为一个好办法.在日常编程中和开发软件时,我们也有这样的需要.本文旨 ...

  6. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  7. (十)WebGIS中地理坐标与屏幕坐标间的转换原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...

  8. opengl 读取3ds(stl)文件

    没有解决: mark 几个网站: 1 http://blog.csdn.net/icebergkevin/article/details/18974235 能实现二维的 2 http://www.cn ...

  9. 在SQL Serve里停用行和页层级锁

    今天我想谈下SQL Server里另一个非常有趣的话题:在SQL Server里停用行和页层级锁.在SQL Server里,每次你重建一个索引,你可以使用ALLOW_ROW_LOCKS 和ALLOW_ ...

  10. 百度地图、ECharts整合HT for Web网络拓扑图应用

    前一篇谈及到了ECharts整合HT for Web的网络拓扑图应用,后来在ECharts的Demo中看到了有关空气质量的相关报表应用,就想将百度地图.ECharts和HT for Web三者结合起来 ...