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(, , )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浅析的更多相关文章
- java sqlite配置和自定义函数
资源 jetty Jetty Downloads地址 sqlite sqlite JDBC Driver 地址:bitbucket代码托管 和 Github代码托管 jetty配置sqlite 在je ...
- 浅析SQLite的锁机制和WAL技术
锁机制 SQLite基于锁来实现并发控制.SQLite的锁是粗粒度的,并不拥有PostgreSQL那样细粒度的行锁,这也使得SQLite较为轻量级.当一个连接要写数据库时,所有其它的连接都被锁住,直到 ...
- Android开发学习之SQLite数据存取浅析
一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- Sqlite注入测试
测试了一个网站是Sqlite数据库,还装有安全狗,绕过了防护,找到Payload,写了一个Python脚本来跑表,这里总结一下: 取得sqlite数据库里所有的表名 查询table,type 段是't ...
- MVC框架浅析(基于PHP)
MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...
- 内存管理 & 内存优化技巧 浅析
内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...
- GreenDao开源ORM框架浅析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011133213/article/details/37738943 Android程序开发中,避免 ...
- 沉淀,再出发:docker的原理浅析
沉淀,再出发:docker的原理浅析 一.前言 在我们使用docker的时候,很多情况下我们对于一些概念的理解是停留在名称和用法的地步,如果更进一步理解了docker的本质,我们的技术一定会有质的进步 ...
- [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
随机推荐
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
对于上面创建的这个Hello World应用来说,程序入口点由应用自身来提供,所以应用本身具有自我执行的能力.从应用托管(Host)的角度来讲,这样的应用同时负责对自身的托管.将应用与托管环境独立起来 ...
- Android自定义属性
上一篇讲解了Android自定义View,这篇来讲解一下Android自定义属性的使用,让你get新技能.希望我的分享能帮助到大家. 做Android布局是件很享受的事,这得益于他良好的xml方式.使 ...
- IE内核发送ajax请求时不会将url中的参数编码
有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...
- javascript中异步和闭包产生的困惑
这里我不打算大谈特谈什么是异步,什么是闭包,这些内容在博客园都已经写的够多的了,但是这些内容出现的多,并不代表所有初学者都已经撑握了,所以我还是打算,用一个比较常见的示例来分析一下,或许能让对这个问题 ...
- MyCAT全局序列号
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式. 本地文件方式 原理:此方式MyCA ...
- AVFoundation播放视频时显示字幕,切换音轨
主要用到两个类:AVMediaSelectionGroup 和 AVMediaSelectionOption 调用 AVAsset对象的availableMediaCharacteristicsWit ...
- 相克军_Oracle体系_随堂笔记001-概述
一.Oracle官方支持 1.在线官方文档 http://docs.oracle.com/ 2.metalink.oracle.com,如今已经改成:http://support.oracle.com ...
- 微信扫码支付+Asp.Net MVC
这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下.(demo在最下方) 一.准备工作 使用的微信API中的统一下单方法,关键的参数是‘公众账号I ...
- 7.5 数据注解特性--MaxLength&&MinLength
MaxLength attribute can be applied to a string or array type property of a domain class. EF Code Fir ...
- 自己封装的一个LoadRes组件
这两周一直太忙,没有好好处理上上上周遇到的一个让我加班到凌晨的问题,这个问题是判断flash的加载. 之前的思路是让flash的人在制作flash的时候,加入了一个回调方法,该方法再会回调我页面的方法 ...