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. 救济金发放(UVa133)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...

  2. 搭建 GIT 服务器

    Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 git 服务器. 安装依赖库和编译工具 为了后续安装能 ...

  3. bzoj 1102

    思路:用dfs 会爆栈,巨坑,要用bfs. #include<bits/stdc++.h> #define LL long long #define fi first #define se ...

  4. Python基本语法[二]

    Python基本语法 1.定义变量:  代码正文: x= y= z=x+y 代码讲解: 2.判断语句:  代码正文: score= : print("你真棒") print(&qu ...

  5. 牛客练习赛9 F - 珂朵莉的约数

    题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长 ...

  6. angular4 动态Form中获取表单字段并在页面中使用的方法

    主要有两种方式 第一种 使用get属性 页面中使用如下: 第二种 使用普通方法事件  页面中使用如下 *转载请附出处

  7. spring杂碎

    spring优点 方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦 ...

  8. Python 2.7.x 和 3.x 版本的语法区别

    <__future__模块> Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容.如果你希望在 ...

  9. BZOJ1087【状压DP】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1087] 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击 ...

  10. [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 5838  Solved: 2345[Submit][Sta ...