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

简介:

1.    Sqlite3数据类型及存储类

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

   (1NULL,值是NULL

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

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

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

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

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

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

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

2.    Sqlite3函数功能简介

   1)基本函数及结构体

     sqlite3        *pdb  //数据库句柄,跟文件句柄FILE很类似
     sqlite3_stmt  *stmt  //这个相当于ODBCCommand对象,用于保存编译好的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) 首先获取iPhoneSqlite 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. {
  4. NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
  5. NSString *pathname = [path objectAtIndex:0]; 
  6. return [pathname stringByAppendingPathComponent:@”database.sqlite3”]; 

3.打开数据库


 
  1. - (BOOL)openDatabase 
  2.  

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

 

4.创建表


 
  1. //创建TimerTable表 
  2.  
  3. - (BOOL)createTimerTable 

  4.     if ([self openDatabase]==YES)
  5.     { 
  6.         char *erroMsg; 
  7.         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]; 
  8.         if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &erroMsg)!= SQLITE_OK)
  9.         { 
  10.             sqlite3_close(database); 
  11.             printf("create table faild"); 
  12.             return NO; 
  13.         } 
  14.         else 
  15.         { 
  16.             printf("table was created"); 
  17.             return YES; 
  18.         }
  19.     } 
  20.     else 
  21.         return NO;
 

5.添加数据


 
  1. //添加Timer 
  2.  
  3. - (BOOL)insertTimer:(TimerInfo *)timerInfo 
  4. {   
  5.     bool isOpen=[self openDatabase]; 
  6.     if (isOpen!=YES) 

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

6.查询数据


 
  1. //查询数据库中所有的TimerInfo,返回一个包含所有TimerInfo的可变数组 
  2.  
  3. -(NSMutableArray *)getAllTimers 

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

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

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

   注:由于我自己目前仍是IOS开发的初学者,在这里只是做下小结,其中难免有说的不对的地方,所以希望大家多多给予指正。



本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/863169,如需转载请自行联系原作者

相关文章
|
29天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
169 0
|
2月前
|
存储 监控 安全
内网屏幕监控软件的数据存储与管理:使用SQLite数据库保存监控记录和配置信息
在当今数字化时代,安全和监控在企业和组织中变得至关重要。内网屏幕监控软件作为一种关键工具,帮助组织监视员工的活动并确保信息安全。这种软件不仅需要高效地记录和管理监控数据,还需要能够方便地进行配置和调整。本文将讨论如何使用SQLite数据库来保存监控记录和配置信息,并介绍如何通过自动化机制将监控到的数据提交到指定网站。
163 2
|
11天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
16天前
|
关系型数据库 MySQL 数据库连接
Python+SQLite数据库实现服务端高并发写入
Python中使用SQLite内存模式实现高并发写入:创建内存数据库连接,建立表格,通过多线程并发写入数据。虽然能避免数据竞争,但由于SQLite内存模式采用锁机制,可能在高并发时引发性能瓶颈。若需更高性能,可选择MySQL或PostgreSQL。
23 0
|
1月前
|
关系型数据库 数据库 C++
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
|
1月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
44 0
|
2月前
|
SQL 数据库管理
sqlite语句order by两个字段同时排序处理
sqlite语句order by两个字段同时排序处理
21 0
|
2月前
|
SQL 关系型数据库 MySQL
Python中的数据库操作:SQLite与MySQL的连接
Python中的数据库操作:SQLite与MySQL的连接
122 0
|
2月前
|
SQL 存储 数据库
艺术型轻量级数据库 --Sqlite
艺术型轻量级数据库 --Sqlite
|
6天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
36 2