iOS嵌入式数据库SQLite3使用简析

移动开发 iOS
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有12个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

1. Sqlite3数据类型及存储类

每个存放在sqlite数据库中(或者由这个数据库引擎操作)的值都有下面中的一个存储类:

(1)NULL,值是NULL

(2)INTEGER,值是有符号整形,根据值的大小以1,2,3,4,6或8字节存放

(3)REAL,值是浮点型值,以8字节IEEE浮点数存放

(4)TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者UTF-16LE)存放

(5)BLOB,只是一个数据块,完全按照输入存放(即没有准换)

:①Sqlite没有单独的布尔存储类型,它使用INTEGER作为存储类 型,0为false,1为true

 ②Sqlite没有另外为存储日期和时间设定一个存储类集,内置的sqlite日期和时间函数能够将日期和时间以TEXT,REAL或INTEGER形式存放

TEXT 作为IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS")
REAL 从格林威治时间11月24日,4174 B.C中午以来的天数
INTEGER 从 1970-01-01 00:00:00 UTC以来的秒数

2. Sqlite3函数功能简介

1)基本函数及结构体

sqlite3        *pdb  //数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt  *stmt  //这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open()       //打开数据库
sqlite3_exec()       //执行非查询的sql语句
sqlite3_prepare()    //准备sql语句,执行select语句或者要使用parameter bind时 ,                             用这个函数(封装了sqlite3_exec).
sqlite3_step()       //在调用sqlite3_prepare后,使用这个函数在记录集中移动。
sqlite3_close()      //关闭数据库文件

2)绑定函数

int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

3)取值函数
sqlite3_column_text(), 取text类型的数据
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据

3. Sqlite3使用步骤

1) 首先获取iPhone上Sqlite 3 的数据库文件的地址
2) 打开Sqlite 3 的数据库文件
3) 定义SQL文
4) 邦定执行SQL所需要的参数
5) 执行SQL文,并获取结果
6) 释放资源
7) 关闭Sqlite 3 数据库。

4. Sqlite3数据操作

由于整个例子代码比较繁琐,这里只列出数据库操作的部分代码作为参考:

1.添加开发包libsqlite3.0.dylib

首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件。

libsqlite3.0.dylib文件地址:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib

2.获取sqlite3的数据库文件地址

  1. //数据库路径  
  2. -(NSString*)databasePath  
  3. NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  4. NSString *pathname = [path objectAtIndex:0];  
  5. return [pathname stringByAppendingPathComponent:@”database.sqlite3”];  
  6. }  

3.打开数据库

  1. - (BOOL)openDatabase  
  2.   
  3. {  
  4.     if (sqlite3_open([[self databasePath] UTF8String],&database) != SQLITE_OK)  
  5.     {  
  6.         sqlite3_close(database);  
  7.         printf("failed to open the database");  
  8.         return NO; 
  9. else   
  10.     {  
  11.         printf("open the database successfully");  
  12.         return YES;  
  13.     } 

4.创建表

  1. //创建TimerTable表  
  2.   
  3. - (BOOL)createTimerTable  
  4. {  
  5.     if ([self openDatabase]==YES) 
  6.     {  
  7.         char *erroMsg;  
  8.         NSString *createSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(timerid INTEGER PRIMARY KEY AUTOINCREMENT,time INTEGER,remaintime INTEGER,iconuri BLOB,vibrate INTEGER,status INTEGER,message TEXT)",TableName];  
  9.         if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &erroMsg)!= SQLITE_OK) 
  10.         {  
  11.             sqlite3_close(database);  
  12.             printf("create table faild");  
  13.             return NO;  
  14.         }  
  15.         else  
  16.         {  
  17.             printf("table was created");  
  18.             return YES;  
  19.         } 
  20.     }  
  21.     else  
  22.         return NO; 
  23. }  

5.添加数据

  1. //添加Timer  
  2.   
  3. - (BOOL)insertTimer:(TimerInfo *)timerInfo  
  4. {    
  5.     bool isOpen=[self openDatabase];  
  6.     if (isOpen!=YES)  
  7. {  
  8.       return NO;  
  9.     }  
  10.     sqlite3_stmt *statement;  
  11.     static char *insertTimerSql="INSERT INTO TimerTable(time,remaintime,iconuri,vibrate,status,message,type) VALUES (?,?,?,?,?,?)";  
  12.     if (sqlite3_prepare_v2(database,insertTimerSql,-1,&statement,NULL)!= SQLITE_OK)  
  13.     {  
  14.         NSLog(@"Error:Failed to insert timer");  
  15.         return NO;  
  16.     }  
  17.     sqlite3_bind_int(statement,1,timerInfo.time);//timerInfo是一个封装了相关属性的实体类对象  
  18.     sqlite3_bind_int(statement,2,timerInfo.remainTime);  
  19.     sqlite3_bind_text(statement,3,[timerInfo.iconuri UTF8String],-1,SQLITE_TRANSIENT);  
  20.     sqlite3_bind_int(statement,4,timerInfo.vibrate);  
  21.     sqlite3_bind_int(statement,5,timerInfo.status);  
  22.     sqlite3_bind_text(statement,6,[timerInfo.message UTF8String],-1,SQLITE_TRANSIENT);  
  23.     int success=sqlite3_step(statement);  
  24.     sqlite3_finalize(statement);  
  25.     if(success==SQLITE_ERROR)  
  26.     {  
  27.         NSLog(@"Error:fail to insert into the database with message.");  
  28.         return NO;  
  29.     }  
  30.     NSLog(@"inserted one timer");  
  31.     return YES;  

6.查询数据

  1. //查询数据库中所有的TimerInfo,返回一个包含所有TimerInfo的可变数组  
  2.   
  3. -(NSMutableArray *)getAllTimers  
  4. {  
  5.     NSMutableArray *arrayTimers=[[NSMutableArray alloc] init];  
  6.     NSString *queryStr=@"SELECT * FROM TimerTable";  
  7.     sqlite3_stmt *statement;  
  8.     if (sqlite3_prepare_v2(database, [queryStr UTF8String], -1, &statement, NULL)!=SQLITE_OK)  
  9.     {  
  10.         printf("Failed to get all timers!\n");    
  11.     }  
  12.     else  
  13.     {  
  14.         while (sqlite3_step(statement)==SQLITE_ROW)  
  15.         {  
  16.             TimerInfo *timerInfo=[[TimerInfo alloc] init]; 
  17.             timerInfo.timerId =sqlite3_column_int(statement,0); 
  18.             timerInfo.time =sqlite3_column_int(statement,1);  
  19.             timerInfo.remainTime=sqlite3_column_int(statement,2);  
  20.             timerInfo.vibrate =sqlite3_column_int(statement,4); 
  21.             timerInfo.status = sqlite3_column_int(statement,5);  
  22.             char *messageChar=sqlite3_column_text(statement,6); 
  23.             if (messageChar==NULL)  
  24.                 timerInfo.message=nil;  
  25.             else  
  26.                 timerInfo.message =[NSString stringWithUTF8String:messageChar];  
  27.             [arrayTimers addObject:timerInfo];  
  28.             [timerInfo release];  
  29.         }  
  30.     }  
  31.     sqlite3_finalize(statement);  
  32.     NSLog(@"arrayTimersCount: %i",[arrayTimers count]); 
  33.     return arrayTimers; 
  34. }  

此外,还有数据库数据的更新及其删除操作就不再依依列出,它们之间只是执行的SQL文不同,其他部分的代码较为类似。

运行效果:(具体页面控件及事件:略)

在这里只是做下小结,其中难免有说的不对的地方,所以希望大家多多给予指正。

责任编辑:闫佳明 来源: blog.51cto
相关推荐

2020-09-18 09:15:22

数据库Sqlite3进阶

2013-04-10 14:21:35

2013-09-02 14:41:05

Java嵌入式SQLite

2020-09-17 09:40:20

数据库Sqlite3命令

2010-09-09 16:42:18

嵌入式IPv6协议栈

2011-03-07 09:57:24

Perst嵌入式数据库

2012-03-06 12:59:11

iOS SQLite3iOSSQLite3

2011-07-07 16:42:38

iPhone Sqlite3 数据库

2012-03-06 10:17:45

iOS SQLite3iOSSQLite3

2017-09-17 12:21:52

移植Linux系统sqlite3

2011-03-11 11:19:05

嵌入式数据库

2012-03-06 09:50:24

Android SQLAndroidSQLite3

2011-06-02 10:24:48

Android SQLite

2013-05-03 13:42:20

iOS开发SQLite3存储读取

2009-01-18 15:36:04

2013-09-22 10:39:00

MeayunDB

2011-07-08 10:45:19

SqlceSqlCeConnec

2020-07-31 08:07:54

Python开发数据库

2009-11-19 09:35:36

eXtremeDB嵌入式实时数据库McObject

2010-03-23 09:08:05

点赞
收藏

51CTO技术栈公众号