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应用是如何运行的(1)
微软在开发ASP.NET 5(当时被称为ASP.NET vNext)是采用的代号为Project K,所以运行时被称为KRuntime.KRuntime是一个SDK,它包含了编译和运行应用程序的所有资 ...
- 用js实现放大镜的效果
第一次发博客,还有点小激动,本人现在正在天津上大学,希望以后从事前端这一行业,学习的时间不长,写博客为了记录自己的学习过程和收获,当然也算是巩固.可能写的东西不会像大牛那样高大上,只是一些基本的内容, ...
- android标题栏下面弹出提示框(一) TextView实现,带动画效果
产品经理用的是ios手机,于是android就走上了模仿的道路.做这个东西也走了一些弯路,写一篇博客放在这里,以后自己也可用参考,也方便别人学习. 弯路: 1.刚开始本来用PopupWindow去实现 ...
- 关于Android多项目依赖在Eclipse中无法关联源代码的问题解决
被Eclipse中Android依赖项目无法关联源代码的问题困扰了许久,网上搜索了一下,终于得到解决,大大提高了开发效率. 问题描述: 项目有A,B两个Android Project组成, B是And ...
- .cn根服务器被攻击之后
如果是互联网行业的人员应该知道,8月25日凌晨,大批的“.cn”域名的网站都无法访问,当然包括weibo.cn等大型网站.个人比较奇怪的一件事情是,微博PC网页版是:www.weibo.com,而mo ...
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...
- 如何利用sendmail发送外部邮件?
在写监控脚本时,为了更好的监控服务器性能,如磁盘空间.系统负载等,有必要在系统出现瓶颈时,及时向管理员进行报告.在这里通常采用邮件报警,同时,邮件设置为收到邮件,即向指定手机号码发送短信.这样可以实现 ...
- Introduction to the Service Provider Interfaces--官方文档
地址:https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html What Are Services? Services are unit ...
- JQuery中使用Ajax实现诸如登录名检测等异步请求Demo
上一篇博客介绍了注册登录时一次性图形验证码的工具类的编写,这篇随笔同样是我在写用jquery中ajax实现登录信息检测的异步请求功能的笔记,在各个网站进行信息用户注册时,需要在不刷新页面的情况下对注册 ...
- HTML5 视频(二) <video> 使用 DOM 进行控制
HTML5 <video> 使用 DOM 进行控制 一.HTML5 <video> 元素同样拥有方法.属性和事件. 其中的方法用于播放.暂停以及加载等.其中的属性(比如时长.音 ...