iOS sqlite 使用事务操作数据库
业务层代码:
//将解析的更新人员数据批量同步到数据库
+(void)operateCompUsers:(NSMutableArray*)operateCompUsers
{
sqliteHelper *mysqlite = [[sqliteHelper alloc]init];
if (operateCompUsers.count<=) return;
if([mysqlite openDatabase:@"ucab_db.db"])
{
NSMutableArray *transactionSql= [[NSMutableArray alloc]init];
for (int i=; i<operateCompUsers.count; i++)
{
CompUser *operateCompUser = [operateCompUsers objectAtIndex:i]; if ([operateCompUser.operateType isEqualToString:@""]) //删除
{
NSString *nsstrSql = [[NSString alloc]initWithFormat:@"%@%@%@",@"delete from cloud_contacts where uid='",operateCompUser.uId,@"'"]; [mysqlite execSql:nsstrSql];
}
if ([operateCompUser.operateType isEqualToString:@""]) //可用,新增数据
{
//先将数据库中的数据删除
NSString *nsstrSql = [[NSString alloc]initWithFormat:@"%@%@%@",@"delete from cloud_contacts where uid='",operateCompUser.uId,@"'"];
[mysqlite execSql:nsstrSql]; //再添加一次
if (nil==operateCompUser.uId) operateCompUser.uId=@"";
if (nil==operateCompUser.cn) operateCompUser.cn=@"";
if (nil==operateCompUser.telephoneNumber) operateCompUser.telephoneNumber=@"";
if (nil==operateCompUser.departmentNumber) operateCompUser.departmentNumber=@"";
if (nil==operateCompUser.deptName) operateCompUser.deptName=@"";
if (nil==operateCompUser.coNo) operateCompUser.coNo=@"";
if (nil==operateCompUser.coName) operateCompUser.coName=@"";
if (nil==operateCompUser.cuOrder) operateCompUser.cuOrder=@"";
if (nil==operateCompUser.mobile) operateCompUser.mobile=@"";
if (nil==operateCompUser.cuMail) operateCompUser.cuMail=@"";
if (nil==operateCompUser.cuAllShow) operateCompUser.cuAllShow=@"";
if (nil==operateCompUser.cuEntryStatus) operateCompUser.cuEntryStatus=@"";
if (nil==operateCompUser.imagePath) operateCompUser.imagePath=@"";
if (nil==operateCompUser.sort) operateCompUser.sort=@"";
if (nil==operateCompUser.duty) operateCompUser.duty=@"";
if (nil==operateCompUser.sex) operateCompUser.sex=@""; //性别默认为男 //组sql语句
NSString *strSql = [NSString stringWithFormat:@"insert into cloud_contacts (uid,cn,telephoneNumber,departmentNumber,deptName,coNo,coName,cuOrder,mobile,cuMail,cuAllShow,cuEntryStatus,imagePath,sort,duty,sex) values ('%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@','%@');",operateCompUser.uId,operateCompUser.cn,operateCompUser.telephoneNumber,operateCompUser.departmentNumber,operateCompUser.deptName,operateCompUser.coNo,operateCompUser.coName,operateCompUser.cuOrder,operateCompUser.mobile,operateCompUser.cuMail,operateCompUser.cuAllShow,operateCompUser.cuEntryStatus,operateCompUser.imagePath,operateCompUser.sort,operateCompUser.duty,operateCompUser.sex]; [transactionSql addObject:strSql];
}
}
[mysqlite execInsertTransactionSql:transactionSql];
[mysqlite closeDatabase];
}
}
数据操作层(使用事务):
//执行插入事务语句
-(void)execInsertTransactionSql:(NSMutableArray *)transactionSql
{
//使用事务,提交插入sql语句
@try{
char *errorMsg;
if (sqlite3_exec(database, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK)
{
NSLog(@"启动事务成功");
sqlite3_free(errorMsg);
sqlite3_stmt *statement;
for (int i = ; i<transactionSql.count; i++)
{
if (sqlite3_prepare_v2(database,[[transactionSql objectAtIndex:i] UTF8String], -, &statement,NULL)==SQLITE_OK)
{
if (sqlite3_step(statement)!=SQLITE_DONE) sqlite3_finalize(statement);
}
}
if (sqlite3_exec(database, "COMMIT", NULL, NULL, &errorMsg)==SQLITE_OK) NSLog(@"提交事务成功");
sqlite3_free(errorMsg);
}
else sqlite3_free(errorMsg);
}
@catch(NSException *e)
{
char *errorMsg;
if (sqlite3_exec(database, "ROLLBACK", NULL, NULL, &errorMsg)==SQLITE_OK) NSLog(@"回滚事务成功");
sqlite3_free(errorMsg);
}
@finally{}
}
参考:
IOS操作SQLite http://taox.l.blog.163.com/blog/static/48365573201262312756819/ (重点参考)
iOS 中sqlite 事务提交代码 http://blog.csdn.net/hekunhotmail/article/details/8735882 (参考的比较多)
http://blog.csdn.net/yanfangjin/article/details/7610422 ios学习--SQLite常用函数 (最后一段,将事务的本质讲明白了)
iOS sqlite 使用事务操作数据库的更多相关文章
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- iOS sqlite C语言操作
利用周六时间看了一下关于sqlite的知识.在这记录一下.看的传智播客视频 对数据的操作基本上就是增删改查: static sqlite3 *db; //声明一个数据库 @implementation ...
- JavaWeb_(Spring框架)整合Mybatis加入事务操作数据库
整合Mybatis a)导包: i.Spring:基本包.aop.aspects.jdbc.tx.test: ii.Mybatis:mybatis-3.4.6 iii.整合包:mybatis-spri ...
- android: SQLite使用 SQL 操作数据库
虽然 Android 已经给我们提供了很多非常方便的 API 用于操作数据库,不过总会有一些 人不习惯去使用这些辅助性的方法,而是更加青睐于直接使用 SQL 来操作数据库.这种人 一般都是属于 SQL ...
- iOS sqlite 的各种操作
iOS --SQL的增加.删除.查找.修改 iOS对于数据库的操作:增加.删除.查找.修改 首先需要创建一个数据库:本程序的数据库是在火狐浏览器里的插件里写的微量型数据库 火狐找查找SQLite Ma ...
- sqlite:多线程操作数据库“database is locked”解决方法
1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患) 可以在编译时/启动时/运行时选择线程模式,参考:http://www.cnblogs.com/liaj/p/4015219.h ...
- [PHP] - PDO事务操作
PHP使用PDO事务操作数据库. 参考文章: http://php.ncong.com/mysql/pdo/pdo_shiwu.html 上代码: <!doctype html> < ...
- c#操作数据库的增删改查语句及DataGridView简单使用
下面是要用户名和密码连接数据库的操作: 一.定义连接字符串,用来链接SQL Server string str_con = "server=.(服务器名称一般为 . );database=W ...
- andorid SQLite数据库的增删改查 和事务操作
.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
随机推荐
- springcloud配置详解
Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...
- Spring:@Cacheable 中condition条件的理解
condition=false时,不读取缓存,直接执行方法体,并返回结果,同时返回结果也不放入缓存. ndition=true时,读取缓存,有缓存则直接返回.无则执行方法体,同时返回结果放入缓存(如果 ...
- python抓取内涵段子文章
# coding:utf-8 from urllib.request import urlretrieve import threading import requests from bs4 impo ...
- AudioEffect中文API
在Android2.3中增加了对音频混响的支持,这些API包含在android.media.audiofx包中. 一.概述 AudioEffect是android audio framework(an ...
- Windows下安装Python requests模块
在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...
- Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果
前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...
- Luogu 1903 数颜色 | 分块
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...
- ThinkPHP 获取指定日期后第N个工作日具体日期
思路: 1.获取到查询年份内所有工作日数据数组2.获取到查询开始日期在工作日的索引3.计算需查询日期索引4.获得查询日期 /*创建日期类型记录表格*/ CREATE TABLE `tb_workday ...
- [js]BOM篇
一.什么是BOM BOM(Browser Object Model)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对 ...
- rabbitmq学习(四) —— 发布订阅
为了说明这种模式,我们将建立一个简单的日志系统.这个系统将由两个程序组成,第一个将发出日志消息,第二个将接收并处理日志消息.在我们的日志系统中,每一个运行的接收程序的副本都会收到日志消息. 交换器(E ...