- 浏览: 769144 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
SQLite是一款轻量级的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,当然还有我们使用的Obj-C。用这种方法保存的数据既可以在客户端存储大量数据,同时能够利用SQL语句灵活地查询、插入、更新或者删除数据。 本人在开发过程中发现关于iOS中SQLite的编程文章实在太少了,大多数都是涉及都一些简单的操作。因此,下面写到的操作我会在简单的SQLite操作基础上(其中包括打开/关闭数据库、构造表、插入、更新或者删除数据操作),再增加两项数据库操作中比较常用的功能实践,分别实现带参数SQL语句的执行以及数据库的事物启动、提交和回滚。废话不多说,直接进入主题吧。 在iOS中使用SQLite我们需要加入libsqlite3.dylib的库,并在引入SQLite的头文件。如下: #import <sqlite3.h> 导入库和头文件之后,接下来的操作就是打开一个数据库。这时候需要调用sqlite3_open这个函数来对打开一个数据库文件。此函数声明如下: int sqlite3_open( const char*filename, /* Database filename (UTF-8)*/ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 其中第一个参数就是数据库所存放的路径,如果路径下没有数据库文件则系统会在此路径下创建一个数据库。至于第二个参数则是数据库的句柄引用,但此函数调用成功后此句柄将会保存打开数据库的句柄,此句柄在往后的数据库操作中需要用到。因此,可如下方式调用: NSString*dbPath=[NSString stringWithFormat:@”%@/Documents/demo.db”,NSHomeDirectory()]; sqlite3*dbHandle; if (sqlite3_open([pathUTF8String], &dbHandle)==SQLITE_OK) { NSLog(@“打开数据库成功!”); } 既然有打开数据库,那么就肯定有关闭数据库的操作了,我们要养成良好的习惯,当需要使用数据库的时候就执行sqlite3_open来打开数据库,等使用完数据库后就调用sqlite3_close函数来对数据库进行关闭。关于sqlite3_close函数声明如下: int sqlite3_close(sqlite3 *); 关闭时传入数据库句柄即可对数据库进行关闭。调用方式如下: if(sqlite3_close(dbHandle)==SQLITE_OK) NSLog(@“关闭数据库成功!”); 接下来需要讲述的是如何对数据库进行操作,常用的有两种方式可以操作数据库中的数据和调整结构。 第一种就是sqlite3_exec函数,这种方法一般使用在不返回数据集的情况,也就是说少用于查询类的操作,同时笔者也尚发现使用此函数如何配合参数使用。如果使用他来创建表结构、更新、插入或者删除操作是一种直观快捷的方法。先来看看此方法的声明: intsqlite3_exec( sqlite3*, /* An opendatabase */ const char *sql, /* SQL to beevaluated */ int(*callback)(void*,int,char**,char**), /*Callback function */ void *, /* 1stargument to callback */ char **errmsg /* Error msgwritten here */ ); 第一个参数就是我们打开数据库的句柄了,第二个参数就是SQL语句,第三个参数为回调方法的函数指针,一旦指定此参数后,当执行语句为查询语句时则在枚举记录集时回对调此方法。第四个参数则为回调的第一个参数引用。关于第三第四个参数还有待研究(如果哪位大虾知道如何使用,不妨告诉小弟,一定感激不尽)。至于第五个参数就是如果方法执行后存在异常,那么这个参数保存的就是错误的描述信息。 第二种就是使用sqlite3_prepare_v2和sqlite3_step两个函数搭配的进行操作。其中sqlite3_prepare_v2是一个将SQL语句编译为sqlite内部一个结构体(sqlite3_stmt).该结构体中包含了将要执行的的SQL语句的信息。而sqlite3_step则是让转化后的SQL进行下一步的操作。因此通过这两个函数可以很方便的获取到数据库中的数据。本人建议使用此方式取得记录集。下面是这两个函数的声明: int sqlite3_prepare_v2( sqlite3 *db, /* Database handle */ const char*zSql, /* SQL statement, UTF-8encoded */ int nByte, /* Maximum length of zSql inbytes. */ sqlite3_stmt**ppStmt, /* OUT: Statement handle */ const char**pzTail /* OUT: Pointer to unusedportion of zSql */ ); 第一个参数就是打开数据库时的数据库句柄对象。第二个就是SQL语句。第三个参数是用于指定SQL语句最大的长度,如果此参数为负数,则根据第二个参数中的第一个终结符为准作为一条完整的语句。如果为非负数,则以第二个参数的第一个终结符(\000或\u0000)或者指定的数字为准作为一条完整语句。第四个参数则是调用函数后返回的一个结构体,此结构体包含了相关语句的信息。关于第五个参数是用于指向前一条语句结束位置,一旦指定此参数,则参数指向位置的左边语句将不进行编译解析。 sqlite3_step(sqlite3_stmt*); 传入参数即为准备语句中的结构体对象。 上面所说的两种方式我将会在下面举例进行说明,但是每个例子不一定两种方式都实现,如果有这方面兴趣的朋友可以自己尝试另外一种方式实现。 例子一:创建数据表 要想让数据库能够存储数据,那就必须得创建一个数据表才能进行数据操作。而数据表是可以包含不同的数据字段,这些字段可以指定不同的数据类型,存储不同的数据。我们建表时可以根据需要进行创建。下面的代码创建了一个叫做persons的数据表,其包含两个字段id和name。其SQL语句为:create table if not exists persons (id integerprimary key autoincrement,name);(如果对SQL语句不太熟悉的朋友可以参考相关方面资料)。那么代码如下所示: char *errorMsg; if (sqlite3_exec(_database, "createtable if not exists persons (id integer primary key autoincrement,name);",NULL, NULL, &errorMsg)!=SQLITE_OK) { NSLog(@“操作失败!”); } sqlite3_free(errorMsg); 上面要注意的一点是,如果你有传入errorMsg参数,那么你必须在执行完sqlite3_exec后,执行sqlite3_free函数来释放errorMsg。否则就会造成内存泄露。 例子二:插入、更新、删除数据 上面的例子创建了一个数据后,那么我们可以往里面插入数据,我们可以使用insert语句将数据插入表中:代码如下所示: char *errorMsg; if (sqlite3_exec(_database, "insertinto persons(name) values(‘张三’);",NULL, NULL, &errorMsg)!=SQLITE_OK) { NSLog(@“操作失败!”); } sqlite3_free(errorMsg); 上面所做的事情就是把一个张三的数据插入了数据表persons中。上面的实现是非常方便的,但是并不安全,因为我们的SQL语句中要插入的数据是拼合到SQL语句中的,这样很容易造成注入问题,因此,我们可以使用下面的方法来实现。 sqlite3_stmt *statement; if (sqlite3_prepare_v2(_database, [@"insertinto persons(name) values(?);" UTF8String], -1, &statement,NULL)!=SQLITE_OK) { return; } //绑定参数 const char *text=[@”张三” cStringUsingEncoding:NSUTF8StringEncoding]; sqlite3_bind_text(statement, index, text,strlen(text), SQLITE_STATIC); if (sqlite3_step(statement)!=SQLITE_DONE){ sqlite3_finalize(statement); return; } sqlite3_finalize(statement); 推荐使用参数进行数据查询和操作,这样可以保证读写数据的正确性和提高安全性。对于更新数据和删除数据的调用方式和插入数据一样,只是SQL语句的差异,其中更新数据使用Update语法,而删除表数据则使用Delete语法。 例子三:事务处理 事务在数据库中是一个重要的概念,使用事务可以保证数据的统一和完整性。同时也可以提高效率。拿我们上面创建的persons表来说,假设我要一次插入20个人的名字才算是操作成功,那么,在不使用事务的情况下,如果插入过程中出现异常或者在插入过程中出现一些其他数据库操作的话,就很有可能影响了操作的完整性。所以事务可以很好地解决这样的情况,首先事务是可以把启动事务过程中的所有操作视为事务的过程。等到所有过程执行完毕后,我们可以根据操作是否成功来决定事务是否进行提交或者回滚。提交事务后会一次性把所有数据提交到数据库,如果回滚了事务就会放弃这次的操作,而对原来表的数据不进行更改。 那么,如何启动,提交还有回滚事务呢?SQLite中分别是:BEGIN、COMMIT和ROLLBACK。下面来看一下例子: @try{ char *errorMsg; if(sqlite3_exec(_database, "BEGIN", NULL, NULL, &errorMsg)==SQLITE_OK){ NSLog(@”启动事务成功”); sqlite3_free(errorMsg); sqlite3_stmt*statement; if(sqlite3_prepare_v2(_database, [@"insert into persons(name) values(?);"UTF8String], -1, &statement, NULL)==SQLITE_OK) { //绑定参数 constchar *text=[@”张三”cStringUsingEncoding:NSUTF8StringEncoding]; sqlite3_bind_text(statement,index, text, strlen(text), SQLITE_STATIC); 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{ } 关于SQLite的操作今天就到这里告一段落,日后有相关的资料或者经验再跟大家分享。</sqlite3.h>
发表评论
-
ios随笔4
2012-06-13 09:44 0<!-- [if gte mso 9]><x ... -
donghua
2012-03-15 13:11 1141iPhone开发中动画效果实现分类代码是本文要介绍的内容,但是 ... -
UIView
2012-02-22 11:54 875iPhone开发应用之UIView开 ... -
iso随笔3
2012-02-13 15:11 087修改UIAlertView背景 UIAlertVie ... -
ios随笔2
2011-12-31 15:35 045 判断是否是 26 个英文 zimu ... -
Lvalue required as left operand of assignment error
2011-12-31 09:25 3376Hello I get the "Lvalue re ... -
NSString常用方法(转)
2011-12-28 09:16 886http://www.cnblogs.com/phonlin/ ... -
ios随笔2
2011-12-27 14:21 045判断是否是26个英文zimu NSString* ... -
ios随笔2
2011-12-27 14:21 045判断是否是26个英文zimu NSString* ... -
tmp
2011-12-16 10:06 1279http://cache.baidu.com/c?m=9d78 ... -
todo
2011-12-12 13:30 0http://bbs.51cto.com/thread-845 ... -
iphone客户端解压gzip
2011-12-11 09:04 1662-(NSData *)uncompressZippedD ... -
HLS
2011-12-11 09:04 4386OS设备上要用原生的浏览器或者播放器来跑直播流媒体,确实是有点 ... -
Flash Media Server 4.5带来Flash末日?
2011-11-01 15:09 1443原文链接:Flash Media Se ... -
IOS开发之──应用之间调用(转)
2011-10-31 14:41 1798转自:http://blog.csdn.net/pjk1129 ... -
内存管理
2011-12-11 09:05 853内存管理可以说是 iPhone 开发中最重要也最令人头疼的关键 ... -
连接 iPhone 的sqlite数据库的一段代码例子(转)
2011-10-26 10:39 1259原帖地址 http://www.cocoachina.com/ ... -
site
2011-10-21 17:52 959常用开发代码:http://www.cnblogs.com/K ... -
ios与android解析(转)
2011-10-17 10:45 919http://bbs.xiaomi.com/thread-34 ... -
电子杂志例子
2011-10-14 17:36 0----------- 程序结构说明及知识点 1。主体是n ...
相关推荐
使用POCO库操作sqlite, vs2015工程, 包含编译好的POCO-1.94的库文件, 使用POCO库操作sqlite, vs2015工程, 包含编译好的POCO-1.94的库文件 使用POCO库操作sqlite, vs2015工程, 包含编译好的POCO-1.94的...
就是刚才我执行的一些操作。 226539|(sync-file-flags 93目录名 文件名) 226540|(file-remove 21 .svn/tmp/svn-7B43C232) 226541|(sync-file-flags 目录名 文件名) 226542|(file-remove 21 .svn/tmp/svn-7B48224E) 4...
项目:基于Sqlite数据库的asp.net三层架构示例 开发:walkingp 时间:2010-4-4 主页:http://www.51obj.cn/ 说明:本来是要做权限管理系统的,但时间太短,就打了一个架构。希望多多包涵。:)
qt案例:使用sqlite进行数据管理,包含增删改查
第一步:调用工具 要生成 sqlite3.lib 就要调用与VC 6.0相配套的工具 LIB.EXE 开始 cmd cd C:\Program Files\Microsoft Visual ...LIB /out:C:\SQLite3\sqlite3.lib /MACHINE:IX86 /DEF:C:\SQLite3\sqlite3.def
Android管理信息系统: 包括SQLite 数据库的增删改查,ListView的刷新,弹出对话框提示操作 ListView列表的优化 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间...
This brief book is an introduction to SQLite for both iOS and Android developers. The book includes an optional introduction to SQL, a discussion of when to use SQLite, and chapters devoted to using ...
NULL 博文链接:https://jianshi-dlw.iteye.com/blog/1179764
本文实例讲述了C#操作SQLite数据库之读写数据库的方法。分享给大家供大家参考,具体如下: 这里演示读写数据库并在窗体(Form)中显示其数据,其方式为: 读: Database(SQLite) -> DataAdapter -> DataSet -> ...
网上很难下载到,分享给需要的:sqlite3odbc.dll 属性 文件版本 1.34455.0,0 产品名称 ODBC Driver for SQLite3 3.43.2 产品版本 0.99991 版权 Copyriglt @2004-2023 ,de> 大小 942 KB 修改日期 2023-10-23 21:50 ...
赠送jar包:sqlite-jdbc-3.34.0.jar; 赠送原API文档:sqlite-jdbc-3.34.0-javadoc.jar; 赠送源代码:sqlite-jdbc-3.34.0-sources.jar; 赠送Maven依赖信息文件:sqlite-jdbc-3.34.0.pom; 包含翻译后的API文档:...
操作SQLite数据库的类
sqlite3文件(用于解决安卓真机中sqlite3:not found的错误) http://blog.csdn.net/hust_twj/article/details/52212558
sqlite数据库转mysql数据库
sqlite数据库,用c++封装类,以及源码实现的对sqlite数据库封装类的操作。同时有boost多线程对sqlite数据库进行操作。 真是学习居家的好例子。。。。
SQLite数据库操作,供大家一起共同分享学习。
sqlite2mysql 从sqlite3转换到mysql的脚本 此脚本基于此网页中的脚本: : r= 要使用它,只需使用以下命令转储 sqlite 数据库: sqlite3 bbdd.sqlite .dump > bbdd.sql 执行脚本将 bbdd.sql 文件转换为 MySQL ...
SQLite官方下载只提供给我们一个sqlite3.dll跟一个sqlite3.def文件,并没有提供用于VC++6.0的lib文件,可以利用sqlite3.def文件生成(此文档已生成了,可以直接使用),步骤如下: 1.将sqlite3.h(D:\sqlite-...
连接JDBC的URL格式为jdbc:sqlite:/path。这里的path为指定到SQLite数据库文件的路径,例如: jdbc:sqlite://dirA/dirB/dbfile jdbc:sqlite://DRIVE:/dirA/dirB/dbfile jdbc:sqlite://COMPUTERNAME/shareA/dirB/db...