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; } ...
随机推荐
- Android播放gif动画,增加屏幕掉金币效果
前言:播放gif的版本有很多,我这边使用Android自带的Movie类播放gif动画,也是在别人的基础上进行修改.有同样需求的朋友可以参考我的demo. 1.效果图如下: 2.部分主要代码 Main ...
- Cmd Markdown编辑器简明语法手册
标签: Cmd-Markdown 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 斜体,这是 粗体. 2. 分级标题 使用 === 表示一级标题,使用 --- 表示二级标题. 示 ...
- PHP程序员如何理解IoC/DI
思想是解决问题的根本 思想必须转换成习惯构建一套完整的思想体系是开发能力成熟的标志 详情请点击
- Java ConcurrentHashMap Example and Iterator--转
原文地址:http://www.journaldev.com/122/java-concurrenthashmap-example-iterator#comment-27448 Today we wi ...
- angular中的$q.defer()服务异步处理
jquery和angular都有defer服务,我暂以angular为例谈谈我的理解,最后并附上jquery的阮一峰总结的defer. 以我目前项目的部分代码为例说明为什么要用deferred. fu ...
- Date, TimeZone, MongoDB, java中date的时区问题
打印new Date(),Fri Aug 12 13:37:51 CST 2016. 显示Asia/Shanghai的时区,但是date toString 的时区简写却是CST.更坑爹的是,Googl ...
- X240 Win10企业版 14279版本 电池标尺白底问题
win10系统更新到14279版本: 电池标尺显示白底,而且右键也不可打开"启动电池管理器-" (1)首先安装lenovo settings 下载地址:http://think.l ...
- Java 技能树
- [Java IO]04_系统标准IO
System表示系统类,它有3个与 Java IO 有关的常量. System.out——系统标准输出 System.in——系统标准输入 System.err——错误信息输出 System.out ...
- springMVC学习笔记(二)-----注解和非注解入门小程序
最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...