ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防

在数据库创建时应判断数据是否存在(不为空nil)

if(sqlite==nil){// 判断数据库是否存在,若存在就不创建,若不存在才创建,以防数据库锁死

if (SQLITE_OK == sqlite3_open(dpPath.UTF8String ,
&sqlite)) {

NSLog(@"数据库创建成功");

}else{

NSLog(@"数据库创建失败");

}

}

#import "SqlManager.h"

#import "ScrollImage.h"

#import "MyTableViewCell.h"

#include "HeadPageCell.h"

@interface SqlManager ()

{

NSMutableArray * _array;

NSMutableArray * _arrayForHeadCell;

}

@end

@implementation SqlManager

#pragma mark - 创建数据库

+ (sqlite3 *)createSql{

static sqlite3 * sqlite;

// 1.获取数据库document文件地址

NSString * appPath =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES)[0];

NSLog(@"%@",appPath);

//2.拼接新建数据库路径

NSString * dpPath = [appPath
stringByAppendingPathComponent:@"allUsers.sqlite"];

if(sqlite==nil){//
判断数据库是否存在,若存在就不创建,若不存在才创建,以防数据库锁死

if (SQLITE_OK ==
sqlite3_open(dpPath.UTF8String , &sqlite)) {

NSLog(@"数据库创建成功");

}else{

NSLog(@"数据库创建失败");

}

}

return sqlite;

}

#pragma mark - 创建table,增加、删除、修改、添加table数据(抽成一个方法)

+ (void)fixTableDataSentence:(NSString *)sentence{

sqlite3 * sqlite = [self
createSql];

char * errmsg;

if (SQLITE_OK ==
sqlite3_exec(sqlite, sentence.UTF8String,
nil, nil, &errmsg)) {

NSLog(@"创建成功");

}else{

NSLog(@"%s",errmsg);

}

/*

// 2.插入数据(增),因为设置id为自增,所以不输入直接为1

insert into t_class (class_name,person_count) values(‘class1‘,10)

// 3.删除数据(删)

// table里的全删  deleta from t_class

// 删除指定id=5的数据    delete from t_class where class_id=5

// 4.修改数据

name全改成newclassname     update t_class set class_name=‘newclassname‘

修改某一行的某个数据 update t_class set class_name=‘newclassname‘ where class_id=7

*/ //增删改语句

}

#pragma mark - 查询数据

- (BOOL)queryDataSentence:(NSString *)sentence{

sqlite3_stmt * stmt;//
结果集(查询数据的结果存放的地方)

sqlite3 * sqlite = [SqlManager
createSql];

// 遍历结果集

if(SQLITE_OK ==
sqlite3_prepare_v2(sqlite, sentence.UTF8String, -1, &stmt,
nil)){

// 1.遍历当前结果集,并取出数据

_array = [NSMutableArray
array];// 初始化可变数组

while (sqlite3_step(stmt)==SQLITE_ROW ) {

int  count = sqlite3_column_int(stmt,
0);

NSLog(@"%i",count);

return count==0;

//            int personId = sqlite3_column_int(stmt, 0);// 0第一列

//            const unsigned char * personName = sqlite3_column_text(stmt, 1);

//            const unsigned char * psw = sqlite3_column_text(stmt, 2);

//            NSLog(@"%i========%s========%s",personId,personName,psw);

/*

// 创建模型

Person * per = [[Person alloc]init];

// 给模型赋值

per.Id = personId;

per.account = [NSString stringWithUTF8String:(const char *)personName];

per.psw = [NSString stringWithUTF8String:(const char *)psw];

// 将模型加入可变数组

[_personArray addObject:per];

*/

}

}else{

NSLog(@"账号重复");

}

//    NSLog(@"%@",_personArray);

sqlite3_finalize(stmt);

return
NO;

}

#pragma mark - 查询数据调用数据

- (NSArray * )useSqliteData{

sqlite3 * sqlite = [SqlManager
createSql];

sqlite3_stmt * stmt;//
结果集(查询数据的结果存放的地方)

NSString * querySql =
@"select * from t_scroll";

//    sqlite3_step(stmt)==SQLITE_ROW
一步步的走到结果集

if (SQLITE_OK ==
sqlite3_prepare_v2(sqlite, querySql.UTF8String, -1, &stmt,
nil)) {

// 1.便利当前结果集,并且取出数据

_array = [NSMutableArray
array];

while (sqlite3_step(stmt)==SQLITE_ROW) {

int Id = sqlite3_column_int(stmt,
0);// 0 第一列

const unsigned
char * path = sqlite3_column_text(stmt,
1);

const unsigned
char * desc = sqlite3_column_text(stmt,
2);

NSLog(@"%i======%s========%s",Id,path,desc);

ScrollImage * scroll = [[ScrollImage
alloc]init];

scroll.Id =  Id ;

scroll.imagePath = [NSString
stringWithUTF8String:(const
char *)path];

scroll.imageDecs = [NSString
stringWithUTF8String:(const
char *)desc];

//            Person * per = [[Person alloc]init];

//            per.name =[NSString stringWithUTF8String:(const char *)personName];

//            scroll.Id = personId;

//            per.psw = [NSString stringWithUTF8String:(const char *)psw] ;

[_array
addObject:scroll];

}

}else{

NSLog(@"查询失败");

}

NSLog(@"%@",_array);

sqlite3_finalize(stmt);

return (NSArray *)_array;

}

#pragma mark - 查询数据调用数据

- (NSArray * )useSqliteDataForHeadCell{

sqlite3 * sqlite = [SqlManager
createSql];

sqlite3_stmt * stmt;//
结果集(查询数据的结果存放的地方)

NSString * querySql =
@"select * from t_headCell";

//    sqlite3_step(stmt)==SQLITE_ROW
一步步的走到结果集

_arrayForHeadCell = [NSMutableArray
array];//
可变数组初始化

if (SQLITE_OK ==
sqlite3_prepare_v2(sqlite, querySql.UTF8String, -1, &stmt,
nil)) {

// 1.便利当前结果集,并且取出数据

while (sqlite3_step(stmt)==SQLITE_ROW) {

int Id = sqlite3_column_int(stmt,
0);// 0 第一列

const unsigned
char * path = sqlite3_column_text(stmt,
1);

const unsigned
char * title = sqlite3_column_text(stmt,
2);

const unsigned
char * subtitle =
sqlite3_column_text(stmt, 3);

const unsigned
char * content = sqlite3_column_text(stmt,
4);

int nums = sqlite3_column_int(stmt,
5);

HeadPageCell  * cell = [[HeadPageCell
alloc]init];

cell.Id =  Id ;

cell.imagePath = [NSString
stringWithUTF8String:(const
char *)path];

cell.title = [NSString
stringWithUTF8String:(const
char *)title];

cell.subTitle = [NSString
stringWithUTF8String:(const
char *)subtitle];

cell.content = [NSString
stringWithUTF8String:(const
char *)content];

cell.nums = nums;

[_arrayForHeadCell
addObject:cell];

}

}else{

NSLog(@"查询失败");

}

NSLog(@"%@",_arrayForHeadCell);

return (NSArray *)_arrayForHeadCell;

}

#pragma mark - 关闭数据库文件

+ (void)closeSql{

sqlite3 * sqlite = [self
createSql];

sqlite3_close(sqlite);

//    sqlite = nil;

}

@end

ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios
sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防

时间: 2024-08-10 10:59:15

ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防的相关文章

iOS SQLite3数据库操作

iOS中数据持久化分为四种:属性列表.对象归档.SQLite3和Core Data,SQLite3数据库操作是一个必不或缺的技术. SQLite3简介 SQLite3数据库是移动端(iOS.Android.嵌入式)上认定的关系型数据库,与MySQL.Oracle等数据库相比,具有轻量级的优势,这就造成了体积小.迅速.简单功能依旧强大等优势. SQLite3语句特点 不区分大小写 每一句以:结尾 SQLite字段类型 integer:整型 real:浮点值 text:文本字符串 blob:二进制类

iOS sqlite3数据库解析

看来从版本3.3.1基本上已经支持线程句柄的传递功能.具体限制我标记了一下.(6) Is SQLite threadsafe?SQLite is threadsafe. We make this concession since many users choose to ignore the advice given in the previous paragraph. But in order to be thread-safe, SQLite must be compiled with th

iOS 把数据库文件打包到mainbundle中,查找不到路径的解决办法;以及在删除bundle中文件的可行性

在开发中有时我们需要把数据库文件打包到我们的项目中,一般我们都是在外部用工具生成数据库文件,然后拉入项目中,但是我们在程序中查找改文件时,返回的路径总是nil 解决办法: 原因我们拉入其他资源文件(比如:图片.代码文件等)Xcode都会自动添加到target 的 "Build Phases" 下 "Copy Bundle Resources目录下,但是我们拉过来的数据库文件这里是找不到的,可能是Xcode无法识别这类文件(当我们拉去过来时),所以我们要做的就是把刚才添加的db

iOS开发——post异步网络请求封装

IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异步的,post的请求方式.通过ios的原生函数简单封装.通过这个封装可以方便的访问http服务器,获取数据,也可以容易的异步加载网络图片. 首先新建一个httpHelper类,在这个类里进行封装,封装的函数名称就叫做post,参数有请求的地址url,请求的参数params,返回数据后回调的函数blo

iOS的KVO使用和轻量级封装

KVO的用法 注册 [object addObserver:observer forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil]; 实现回调方法 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if(

设计模式在实际业务应用中的介绍之1——抽象工厂模式实现对数据库访问组件的封装

设计模式在实际业务应用中的介绍之1--抽象工厂模式实现对数据库访问组件的封装 基于C#打造的通用数据库访问组件 基于C#打造的通用数据库访问组件,完全支持开闭原则,设计上支持可扩展支持任意主流数据库,目前组件只实现了Oracle.MS SQL.MySQL三种库. 该组件实现简单.架构清晰,目前组件只包括5个类文件,兼容了三种数据库,组件实现采用了单例模式.工厂模式. 获取组件源码请入QQ群706224870,在群文件中下载.入群验证信息:codefc 下面简单描述下实现思路: 5个类文件如下:D

iOS:本地数据库sqlite3的使用

一.数据库的概念: 1..什么是数据库 SQL Server 2010.Oracle.MySQL 关系数据库 NoSQL数据库-非关系型数据库 数据库主要由表组成 表由字段组成 数据 就是表中的记录 表间的关系:一对一.一对多(订单:订单的头和订单明细) 外键 主键:建立索引,不能重复 2.SQL(结构化查询语言)语句 A.数据操作的SQL语句: 2.1 查询     select(字段名) from(表名):     where 子句:定义查询条件     排序:order by 字段名 (a

iOS开发数据库篇—SQLite简单介绍

转自:http://www.cnblogs.com/wendingding/p/3868893.html 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1)归档:NSCodeing.NSKeyedArchiver (2)偏好设置:NSUserDefaults (3)Plist存储:writeToFile 提示:上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题.

iOS sqlite数据库使用

关于sqlite是一个轻量的.跨平台的.开源的数据库引擎.他在读写效率,操作便捷程度,内存消耗上具有很大的优越性,所以很受移动开发者的喜爱.当然,sqlite 也因其力求简单高效,也就限制了它对并发,海量数据的处理.这篇博客主要讲的是iOS开发中sqlite和开源库FMDB的使用. demo 地址 TP 常使用的方法介绍 首先打开数据库 int result = sqlite3_open_v2(fileName.UTF8String, &db, SQLITE_IOERR_READ|SQLITE_