SQLite支持的常见数据类型如下所示。
–INTEGER 有符号的整数类型
–REAL 浮点类型
–TEXT 字符串类型,采用UTF-8和UTF-16字符编码
–BLOB 二进制大对象类型,能够存放任何二进制数据
 
(C语言中)使用步骤:
1.新建项目时,先导入系统框架(C语言). (libsqlite3)
 
2.头文件#import<sqlite3.h>
 
3. sqlite3_open(fileName.UTF8String, &_db); 打开或者创建一个数据

*_db自己定义一个sqlite3的成员变量.进行增删改查时要用

 
4.sqlite3_exec(_db, sql, NULL, NULL,&error);  //不带结果集的语句,只是对表做操作,不会返回出结果
*该函数可进行insert,delete,update操作.
 
5.查询操作select. //带结果集的查询语句,会返回出结果,从表中查询到的数据都会放到stmt结构体中
*sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);做查询前准备,检测SQL语句是否正确.
*sqlite3_step(stmt) 提取查询到的数据,一次提取一条.//通过循环可以取出所有数据
*sqlite3_column_text(stmt, 0)取出第0列的数据.
 
6.关闭数据库 sqlite3_close(sqlite3 *);
 
————————————————————————————————————————————————————
————————————————————————————————————————————————————
执行带参数的SQL语句

NSString *sqlStr = @"INSERT OR REPLACE INTO note (cdate,content) VALUES (?,?)";

sqlite3_stmt *statement;
//预处理过程,产生结果集
if (sqlite3_prepare_v2(db, [sqlStr UTF8String], -1, &statement,

NULL) == SQLITE_OK)

{

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  NSString *nsdate = [dateFormatter stringFromDate:model.date];

//绑定参数开始
  sqlite3_bind_text(statement, 1, [nsdate UTF8String], -1, NULL);  sqlite3_bind_text(statement, 2, [model.content UTF8String],

-1,    NULL);

//执行插入
if (sqlite3_step(statement) != SQLITE_DONE)

{

NSAssert(NO, @"插入数据失败。"); }

}

}

//清理结果集,防止内存泄露

sqlite3_finalize(statement);

单例模式:(这里主要用来保证初始化的数据库是唯一的,只要创建了一次,那么它就不会被再创建)

+ (NoteDAO*)sharedManager

{

static dispatch_once_t once;

dispatch_once(&once, ^{

sharedManager = [[self alloc] init];

[sharedManager   createEditableCopyOfDatabaseIfNeeded]; }

);

return sharedManager;

}

举例代码如下:

Student.h

 #import <Foundation/Foundation.h>

 @interface Student : NSObject
@property (assign,nonatomic)NSInteger ID;
@property (copy,nonatomic)NSString *name;
@property (assign,nonatomic)NSInteger age;
@property (assign,nonatomic)char gender;
@property (assign,nonatomic)float math;
@property (assign,nonatomic)float english;
@property (assign,nonatomic)float chinese;
@end

Student.m

 #import "Student.h"

 @implementation Student
-(NSString*)description
{
return [NSString stringWithFormat:@"ID:%ld,name:%@,age:%ld,gender:%c,math:%.2lf,english:%.2lf,chinese:%.2lf",_ID,_name,_age,_gender,_math,_english,_chinese];
}
@end

StudentDAO.h(对每一个实体类的数据库封装起来,就采用这种XXXDAO.h/m的命名风格)

 #import <Foundation/Foundation.h>
#import <sqlite3.h>
@class Student;
@interface StudentDAO : NSObject
{
sqlite3 *_db;
}
//单例的方法
+(StudentDAO*)shareManager; //初始化数据库:创建表,添加数据
-(void)initDb; //添加学生记录
-(BOOL)addStudent:(Student *)stu; //删除学生记录
-(BOOL)deleteStudentByName:(NSString *)name; //修改学生记录
-(BOOL)updateStudnet:(Student*)stu; //查询学生记录
//1.查询全部
-(NSArray *)queryStudentAll;
//2.查询符合条件的
-(Student *)queryStudentByName:(NSString*)name; @end

StudentDAO.m

 #import "StudentDAO.h"
#import "Student.h" static StudentDAO *instance = nil;
@implementation StudentDAO //对象只创建一次
+(StudentDAO*)shareManager
{
static dispatch_once_t once;
dispatch_once(&once, ^{
//只执行一次
instance = [StudentDAO new]; [instance initDb];
}); return instance;
} //执行不返回结果集的sql语句
-(BOOL)execSql:(NSString *)sql
{
char *errmsg = NULL;
//增删改操作
sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg); if(errmsg)
{
return NO;
}
else
{
return YES;
}
}
//创建数据库文件路径
-(NSString*)pathForDB
{
NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [dirs lastObject]; //NSLog(@"%@",documentPath); return [documentPath stringByAppendingPathComponent:@"student.db"];
} //初始化数据库:创建表,添加数据
-(void)initDb
{
//打开数据库
//sqlite3_open(fileName.UTF8String,&_db);打开或创建一个数据
//*_db自己定义一个sqlite3的成员变量.进行增删改查时要用
if(sqlite3_open([[self pathForDB] UTF8String], &_db) == SQLITE_OK)
{
//创建学生表
if([self execSql:@"create table student (id integer primary key autoincrement,name text,age integer,gender integer,math real,english real,chinese real)"])
{
//表中添加测试数据
for(int i=; i<; i++)
{
Student *stu = [Student new];
stu.name = [NSString stringWithFormat:@"stu%d",i+];
stu.age = +i;
stu.gender = 'M';
stu.math = +i;
stu.english = +i;
stu.chinese = +i; [self addStudent:stu];
}
}
//关闭数据库
sqlite3_close(_db);
}
} //添加学生记录
-(BOOL)addStudent:(Student *)stu
{
NSString *insertSql = @"insert into student (name,age,gender,math,english,chinese) values(?,?,?,?,?,?)"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
//提取数据一次一条
sqlite3_stmt *Pstmt = NULL;
//查询前准备,看是否正确
if(sqlite3_prepare_v2(_db, [insertSql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [stu.name UTF8String], -, NULL);
sqlite3_bind_int(Pstmt, , (int)stu.age);
sqlite3_bind_int(Pstmt, , stu.gender);
sqlite3_bind_double(Pstmt, , stu.math);
sqlite3_bind_double(Pstmt, , stu.english);
sqlite3_bind_double(Pstmt, , stu.chinese); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //删除学生记录
-(BOOL)deleteStudentByName:(NSString *)name
{
NSString *sql = @"delete from student where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL)== SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //修改学生记录
-(BOOL)updateStudnet:(Student*)stu
{
NSString *sql = @"update student set math = ? where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_double(Pstmt,,stu.math);
sqlite3_bind_text(Pstmt, , [stu.name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_DONE)
{
return YES;
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return NO;
} //查询学生记录
//1.查询全部
-(NSArray *)queryStudentAll
{
NSMutableArray *arrayM = [NSMutableArray array]; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, "select * from student", -, &Pstmt, NULL) == SQLITE_OK)
{
//遍历结果集
while (sqlite3_step(Pstmt) == SQLITE_ROW)
{
Student *stu = [Student new]; stu.ID = sqlite3_column_int(Pstmt, );
stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, )];
stu.age = sqlite3_column_int(Pstmt, );
stu.gender = sqlite3_column_int(Pstmt, );
stu.math = sqlite3_column_double(Pstmt, );
stu.english = sqlite3_column_double(Pstmt, );
stu.chinese = sqlite3_column_double(Pstmt, ); [arrayM addObject:stu];
}
}
//清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return arrayM;
}
//2.查询符合条件的
-(Student *)queryStudentByName:(NSString*)name
{
Student *stu;
NSString *sql = @"select * from student where name = ?"; //打开数据库
if(sqlite3_open([[self pathForDB]UTF8String], &_db) == SQLITE_OK)
{
//准备结果集
sqlite3_stmt *Pstmt = NULL;
if(sqlite3_prepare_v2(_db, [sql UTF8String], -, &Pstmt, NULL) == SQLITE_OK)
{
//绑定参数
sqlite3_bind_text(Pstmt, , [name UTF8String], -, NULL); //执行SQL语句
if(sqlite3_step(Pstmt) == SQLITE_ROW)
{
stu = [Student new]; stu.ID = sqlite3_column_int(Pstmt, );
stu.name = [NSString stringWithFormat:@"%s",sqlite3_column_text(Pstmt, )];
stu.age = sqlite3_column_int(Pstmt, );
stu.gender = sqlite3_column_int(Pstmt, );
stu.math = sqlite3_column_double(Pstmt, );
stu.english = sqlite3_column_double(Pstmt, );
stu.chinese = sqlite3_column_double(Pstmt, );
}
} //清理结果集
sqlite3_finalize(Pstmt); //关闭数据库
sqlite3_close(_db);
}
return stu;;
}
@end

ViewController.m

 #import "ViewController.h"
#import "Student.h"
#import "StudentDAO.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//测试stuDAO
//创建单例对象
StudentDAO *stuDAO = [StudentDAO shareManager]; //查询所有的记录
NSArray *students = [stuDAO queryStudentAll];
NSLog(@"%@",students); //删除一条记录
[stuDAO deleteStudentByName:@"stu3"]; //修改记录
Student *stu = [Student new];
stu.name = @"stu4";
stu.math = 94.5f;
[stuDAO updateStudnet:stu]; //通过名字查询学生
Student *stu2 = [stuDAO queryStudentByName:@"stu5"];
NSLog(@"%@",stu2); //查询所有的记录
students = [stuDAO queryStudentAll];
NSLog(@"%@",students);
}
@end

iOS:面向对象的思想使用sqlite数据库的更多相关文章

  1. 使用iOS原生sqlite3框架对sqlite数据库进行操作

    摘要: iOS中sqlite3框架可以很好的对sqlite数据库进行支持,通过面向对象的封装,可以更易于开发者使用. 使用iOS原生sqlite3框架对sqlite数据库进行操作 一.引言 sqlit ...

  2. iOS学习36数据处理之SQLite数据库

    1. 数据库管理系统 1> SQL语言概述 SQL: SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集, 是一种功能齐全的 ...

  3. php中用面向对象的思想编写mysql数据库操作类

    最近刚入门完mysql,正好学了一阵子php就想着如何把mysql的表信息用php打印页面上.现在就把代码贴出来,以便小伙伴们参考. 先是建立mysql连接: /*建立连接*/ class datab ...

  4. android 43 SQLite数据库

    SQLite数据库很小,占用内存只有几百K,安卓和IOS都是用的SQLite数据库. 页面: <LinearLayout xmlns:android="http://schemas.a ...

  5. QF——iOS中的数据库操作:SQLite数据库,第三方封装库FMDB,CoreData

    SQLite数据库: SQLite是轻量级的数据库,适合应用在移动设备和小型设备上,它的优点是轻量,可移植性强.但它的缺点是它的API是用C写的,不是面向对象的.整体来说,操作起来比较麻烦.所以,一般 ...

  6. iOS中 FMDB第三方SQLite数据库 UI_20

    1.什么是FMDB? FMDB是iOS平台下SQLite数据库,只不过它是OC方式封装了C语言的SQLite语句,使用起来更加面向对象 2.FMDB的优点:1.使用起来更加面向对象; 2.对比苹果自带 ...

  7. FMDB是iOS平台的SQLite数据库框架

    1.FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 为什么使用FMDB使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...

  8. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...

  9. iOS - SQLite 数据库存储

    1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...

随机推荐

  1. 2019.2.25 模拟赛T1【集训队作业2018】小Z的礼物

    T1: [集训队作业2018]小Z的礼物 我们发现我们要求的是覆盖所有集合里的元素的期望时间. 设\(t_{i,j}\)表示第一次覆盖第i行第j列的格子的时间,我们要求的是\(max\{ALL\}\) ...

  2. Robot Framework + Selenium2Lib

    Robot Framework + Selenium2Lib 最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具 ...

  3. lua常用函数

    select (index, ···) 功能:当index为数字将返回所有index大于index的参数: 如:select(2,"a","b","c ...

  4. windows下重置mysql的root密码方法介绍(转)

    自己在内网操作的,遇到了一些的问题,其中一个是需要重置密码的,所以网上找了两篇文章,都有一些借鉴的地方. 版本mysql5.7.2,linux系统 除了参考文章还有几点说明: service mysq ...

  5. STM32使用定时器实现输入捕获

    输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信 ...

  6. scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)

    上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent.随机代理. 一.随机UA 分析:构建随机UA可以采用以下两种方法 我们可以选择很多UserAgent,形成一个列表 ...

  7. Linux下sublime的中文输入问题

    比较久了,今天找到了解决方案: git clone https://github.com/lyfeyaj/sublime-text-imfix.git cd sublime-text-imfix &a ...

  8. Linux 自动化部署

    1.pexpect Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Py ...

  9. ElasticSearch学习笔记--2、ES相关配置

    1.配置文件 ES的配置文件位置:config/elasticsearch.yml可以直接搜索elasticsearch.yml 2.配置远程api访问 network.host: 192.168.1 ...

  10. poj 1984 并查集

    题目意思是一个图中,只有上下左右四个方向的边.给出这样的一些边, 求任意指定的2个节点之间的距离. 就是看不懂,怎么破 /* POJ 1984 并查集 */ #include <stdio.h& ...