iOS数据持久化(二)SQLite
一、什么是SQLite
#import <Foundation/Foundation.h>
#import "Student.h"
@interface DataBaseHandle : NSObject
+ (DataBaseHandle *)shareDataBase;
- (void)openDB;
- (void)closeDB;
//添加数据
- (void)insertNewStudent:(Student *)student;
/**
* 根据学号查询学生
*/
- (Student *)selectStudentWithNumber:(NSInteger)number;
/**
* 查询表中所有数据
*/
- (NSMutableArray *)selectAllStudents;
/**
* 根据学号删除
*/
- (void)deleteStudentWithNumber:(NSInteger)number;
- (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number;
@end
DataBaseHandle.m
+ (DataBaseHandle *)shareDataBase {
@synchronized (self){
if (handle == nil) {
handle = [[DataBaseHandle alloc] init]; // [handle closeDB];
}
}
return handle;
}
sqlite3 *db = nil;
打开数据库
- (void)openDB {
NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
NSString *path = [str stringByAppendingPathComponent:@"student.sqlite"];
NSLog(@"%@",path);
//打开数据库
//UTF8String 将oc字符串转化为C语言字符串 //方法执行完会返回一个数据库对象,这个对象已被初始化
int result = sqlite3_open([path UTF8String], &db);
//如果等于SQLITE_OK说明sql语句执行成功
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
//创建表格
NSString *sqlString = @"create table if not exists Student (number integer primary key autoincrement,name text,gender text,age integer)";
int result = sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"见表成功");
}
} else {
NSLog(@"数据库打开失败");
}
}
关闭数据库
- (void)closeDB {
int result = sqlite3_close(db);
if (result == SQLITE_OK) {
NSLog(@"关闭成功");
}else {
NSLog(@"关闭失败");
}
}
插入数据
- (void)insertNewStudent:(Student *)student {
[self openDB];
//准备sql语句
NSString *sqlString = @"insert into Student (name,gender, age) values (?, ?, ?)";
/*第一个参数,数据库指针,
第二个参数,sql语句
第三个参数,sql语句的长度,写成-1,自动计算
第四个参数,创建管理sql语句的类,statement
第五个参数,预留参数
*/
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"添加语句成功");
//绑定参数
//绑定的参数:1.管理类指针,2.第几个问号,3.绑定的数据, 4.绑定数据的长度 -1 5.
sqlite3_bind_text(stmt, 1, [student.name UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 2, [student.gender UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 3, (int)student.age);
/**/
sqlite3_step(stmt);
} else {
NSLog(@"添加语句失败");
}
sqlite3_finalize(stmt);
[self closeDB];
}
查询数据
- (NSMutableArray *)selectAllStudents {
[self openDB];
NSString *sqlString = @"select * from student";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, nil);
if (result == SQLITE_OK) {
NSLog(@"查询全部成功");
//循环的条件:下一行还有数据,这时就能一直循环下去
NSMutableArray *array = [NSMutableArray arrayWithCapacity:0];
while (sqlite3_step(stmt) == SQLITE_ROW) {
NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
NSInteger age = sqlite3_column_int(stmt, 3); Student *stu = [[Student alloc] init];
stu.name = name;
stu.age = age;
stu.gender = gender;
[array addObject:stu];
[stu release];
}
sqlite3_finalize(stmt);
[self closeDB]; return array;
} else {
NSLog(@"error");
return nil;
}
}
- (Student *)selectStudentWithNumber:(NSInteger)number {
[self openDB]; NSString *sqlString = @"select * from Student where number = ?"; sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
NSLog(@"查询成功");
//绑定参数
sqlite3_bind_int(stmt, 1, (int)number); Student *student = [[[Student alloc] init]autorelease];
while (sqlite3_step(stmt) == SQLITE_ROW) {
student.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
student.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
student.age = sqlite3_column_int(stmt, 3);
}
sqlite3_finalize(stmt);
[self closeDB];
return student; } else {
NSLog(@"不OK");
return nil;
}
}
删除数据
- (void)deleteStudentWithNumber:(NSInteger)number {
[self openDB];
NSString *sqlString = @"delete from Student where number = ?";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, (int)number);
//执行sql语句
sqlite3_step(stmt);
}
//释放stmt的内存资源
sqlite3_finalize(stmt); [self closeDB];
}
修改数据
- (void)updateStudent:(NSString *)gender WithNumber:(NSInteger)number {
[self openDB]; NSString *sqlString = @"update Student set gender = ? where number = ?";
sqlite3_stmt *stmt = nil;
int result = sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &stmt, NULL); if (result == SQLITE_OK) {
sqlite3_bind_int(stmt, 2, (int)number); sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
[self closeDB];
}
iOS数据持久化(二)SQLite的更多相关文章
- IOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data ...
- iOS -数据持久化方式-以真实项目讲解
前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎 ...
- iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)
本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...
- iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver
IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...
- iOS数据持久化方式及class_copyIvarList与class_copyPropertyList的区别
iOS数据持久化方式:plist文件(属性列表)preference(偏好设置)NSKeyedArchiver(归档)SQLite3CoreData沙盒:iOS程序默认情况下只能访问自己的程序目录,这 ...
- iOS数据持久化-OC
沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...
- iOS数据持久化
在iOS中,实现数据持久化一般分为4大种: 1.属性列表 2.对象归档 3.SQLite 4.Core Data 一.属性列表 NSUserDefaults类的使用和NSKeyedArchiver有很 ...
- iOS: 数据持久化方案
数据持久化方案(如果总结不到位,或者有误的地方,敬请斧正) 一.功能: 主要是将数据持久化到本地,减少对网络请求的次数,既节省了用户的流量,也增强了App的体验效果. 二.种类: plist存储:使 ...
- iOS数据持久化存储:归档
在平时的iOS开发中,我们经常用到的数据持久化存储方式大概主要有:NSUserDefaults(plist),文件,数据库,归档..前三种比较经常用到,第四种归档我个人感觉用的还是比较少的,恰恰因为用 ...
- 转载 -- iOS数据持久化存储
作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方 ...
随机推荐
- 【转】android开源项目和框架
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github ...
- 安卓高手之路之PackageManagerservice
源码位置:frameworks/base/core/java/android/content/pm/PackageParser.java 源文件路径:android\frameworks\base\s ...
- Android6.0动态权限申请步骤以及需要注意的一些坑
因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo.算是自己的笔记吧,可能会比较混乱,主要是方便以后查看.后期有别的问题,随时更 ...
- innobackupex的备份和恢复
http://blog.itpub.net/15480802/viewspace-1173479/ 1 原理 分3个阶段:备份backup – 预恢复prepare -- 恢复restore 注 ...
- Can't find keyplane iOS模拟器键盘不显示解决办法
静下心来学技术,新一波的问题再度来袭 学习swift的时候做一个app,需要用到数字键盘,但是在调试了几次后数字键盘便出不来了,控制台中弹出这样一个错误 Can't find keyplane tha ...
- Python Counter()计数工具
Table of Contents 1. class collections.Counter([iterable-or-mapping]) 1.1. 例子 1.2. 使用实例 2. To Be Con ...
- jquery 和 $
而jQuery就是jQuery库提供的一个函数.(好像也不仅仅只是函数, 因为还有 $.ajax(options) 这样的使用,等同 jQuery.ajax(options)) 这个函数的作用是根据 ...
- jQuery显示和隐藏 常用的状态判断方法
显示:show() display:block; 隐藏:hide() display:none; 当显示和隐藏切换的时候,需要判断此刻是显示还是隐藏,那判断条件常用以下几种方法: 1.if(th ...
- 使用block来解决实现switch解决字符串
NSString *lookup=@"Hearts"; typedef void (^CaseBlock)(); NSDictionary *diction=@{@"D ...
- Flask-在浏览器中直接显示文本文件中的内容
目录结构: project├── info.json├── run.py└── static └── readme.txt # 直接返回static目录下的文件内容 @app.route( ...