[How to]集成SQLite3
1.简介
本文将介绍IOS的开发过程中如何集成Sqlite的方法,目前Sqlite的版本为3,所以我们称之为Sqlite3.
在本文中我将介绍Sqlite3的开发配置,本地Sqlite3数据库的建立通用的数据库访问类。
2.Sqlite3的开发环境配置
1.在工程中引入SQlite3开发库。
按照下图进行设定:


3.建立Sqlite数据库和表
1.打开终端窗口,输入如下命令:
172-11-253-106:~ apple$ sqlite3 exampleSqlite3_db.sql
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite>
如上我们建立了一个名为exampleSqlite3_db的数据库。
2.建表
CREATE TABLE peopleInfo(peopleInfoID integer primary key, firstname text, lastname text, age integer);
表建立完毕后我们可以通过命令查询表是否建立成功:
sqlite> .tables peopleInfo sqlite>
随后退出:
sqlite> .quit 172-11-253-106:~ apple$
3. 至此本地所需要的数据库和表初始化完毕,将文件导入当前工程

4.至此本地数据库和数据库连接文件都已经创建完毕。
4.建立通用的数据库访问类
1.建立数据库model
#import <Foundation/Foundation.h> @interface PeopleInfo : NSObject @property(nonatomic, assign) NSInteger peopleInfoID; @property(nonatomic, strong) NSString * firstname; @property(nonatomic, strong) NSString * lastname; @property(nonatomic, assign) NSInteger age; @end
2.建立通用的Sqlite3访问类
.h文件
// // DBManager.h // how_to_playwith_Sqlite3 // // Created by apple on 15/12/14. // Copyright © 2015年 xufeng. All rights reserved. // #import <Foundation/Foundation.h> /** * Sqlite3访问类 */ @interface DBManager : NSObject /** * sql执行后受影响的行数,如delete、insert和update的时候可以以此判断数据库是否操作正常 */ @property (nonatomic) int affectedRows; /** * 记录最后一次的操作索引 */ @property (nonatomic) long long lastInsertedRowID; /** * 加载数据库文件 * * @param dbFilename 沙盘中的数据库文件 * * @return 数据库操作handler */ -(instancetype)initWithDatabaseFilename:(NSString *)dbFilename; /** * 执行查询操作 * * @param query 查询语句 * * @return 查询结果 */ -(NSArray *)loadDataFromDB:(NSString *)query; /** * 执行增删和更新的语句 * * @param query 执行语句 */ -(void)executeQuery:(NSString *)query; @end
.m文件
//
// DBManager.m
// how_to_playwith_Sqlite3
//
// Created by apple on 15/12/14.
// Copyright © 2015年 apple. All rights reserved.
//
#import "DBManager.h"
#import <sqlite3.h>
@interface DBManager()
/**
* 应用的Documents Directory
*/
@property (nonatomic, strong) NSString *documentsDirectory;
/**
* 数据库文件
*/
@property (nonatomic, strong) NSString *databaseFilename;
/**
* 结果数组
*/
@property (nonatomic, strong) NSMutableArray *arrResults;
/**
* 将bundle中的文件拷贝到Documents Directory
*/
-(void)copyDatabaseIntoDocumentsDirectory;
/**
* 执行SQLite语句
*
* @param query SQLite语句
* @param queryExecutable 查询还是修改
*/
-(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable;
@end
@implementation DBManager
-(instancetype)initWithDatabaseFilename:(NSString *)dbFilename{
self = [super init];
if (self) {
// 查找Documents Directory路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
self.documentsDirectory = [paths objectAtIndex:];
// 保存传入的数据库文件
self.databaseFilename = dbFilename;
// 将bundle中的文件拷贝到Documents Directory
[self copyDatabaseIntoDocumentsDirectory];
}
return self;
}
-(void)copyDatabaseIntoDocumentsDirectory{
// 查询数据库文件是否在ocuments Directory已经存在?
NSString *destinationPath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];
if (![[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) {
// 如果不不存在则从bundle中将数据库文件拷贝到Documents Directory
NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseFilename];
NSError *error;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:destinationPath error:&error];
// 查看是够有错误
if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
}
}
}
-(NSArray *)loadDataFromDB:(NSString *)query{
// 执行查询
[self runQuery:[query UTF8String] isQueryExecutable:NO];
// 返回查询结果
return (NSArray *)self.arrResults;
}
-(void)executeQuery:(NSString *)query{
// 执行修改操作
[self runQuery:[query UTF8String] isQueryExecutable:YES];
}
-(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable
{
// 数据库连接变量
sqlite3 *sqlite3Database;
// 设定数据库文件
NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];
// 重置结果容器
if (self.arrResults != nil) {
[self.arrResults removeAllObjects];
self.arrResults = nil;
}
self.arrResults = [[NSMutableArray alloc] init];
// 打开数据库
int openDatabaseResult = sqlite3_open([databasePath UTF8String], &sqlite3Database);
if(openDatabaseResult == SQLITE_OK) {
// Declare a sqlite3_stmt object in which will be stored the query after having been compiled into a SQLite statement.
sqlite3_stmt *compiledStatement;
// Load all data from database to memory.
, &compiledStatement, NULL);
if(prepareStatementResult == SQLITE_OK) {
// Check if the query is non-executable.
if (!queryExecutable){
// In this case data must be loaded from the database.
// Declare an array to keep the data for each fetched row.
NSMutableArray *arrDataRow;
// Declare an array to keep the col name for each fetched row.
NSMutableArray *arrColRow;
// Loop through the results and add them to the results array row by row.
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Initialize the mutable array that will contain the data of a fetched row.
arrDataRow = [[NSMutableArray alloc] init];
arrColRow = [[NSMutableArray alloc] init];
// Get the total number of columns.
int totalColumns = sqlite3_column_count(compiledStatement);
// Go through all columns and fetch each column data.
; i<totalColumns; i++){
// Convert the column data to text (characters).
char *dbDataAsChars = (char *)sqlite3_column_text(compiledStatement, i);
char *dbColAsChars = (char *)sqlite3_column_name(compiledStatement, i);
// If there are contents in the currenct column (field) then add them to the current row array.
if (dbDataAsChars != NULL) {
// Convert the characters to string.
[arrDataRow addObject:[NSString stringWithUTF8String:dbDataAsChars]];
[arrColRow addObject:[NSString stringWithUTF8String:dbColAsChars]];
}
}
// Store each fetched data row in the results array, but first check if there is actually data.
) {
// first of all, we should put them in dictionary
[self.arrResults addObject:[NSDictionary dictionaryWithObjects:arrDataRow forKeys:arrColRow]];
}
}
}
else {
// This is the case of an executable query (insert, update, ...).
// Execute the query.
int executeQueryResults = sqlite3_step(compiledStatement);
if (executeQueryResults == SQLITE_DONE) {
// Keep the affected rows.
self.affectedRows = sqlite3_changes(sqlite3Database);
// Keep the last inserted row ID.
self.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database);
}
else {
// If could not execute the query show the error message on the debugger.
NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database));
}
}
}
else {
// In the database cannot be opened then show the error message on the debugger.
NSLog(@"%s", sqlite3_errmsg(sqlite3Database));
}
// Release the compiled statement from memory.
sqlite3_finalize(compiledStatement);
}
// Close the database.
sqlite3_close(sqlite3Database);
}
@end
3. 测试(先插入后查询)
插入如下测试语句:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 数据库客户端操作-打开
DBManager *dbm = [[DBManager alloc] initWithDatabaseFilename:@"exampleSqlite3_db.sql"];
// 数据库客户端操作-插入s
[dbm executeQuery:@"insert into peopleInfo values(100,'zhang','san',20)"];
!= dbm.affectedRows) {
NSLog(@"%@", @"error happend!");
}
else{
// 数据库客户端操作-查询
NSArray *result = [dbm loadDataFromDB:@"select * from peopleInfo"];
// 每行既是一个item,将其转化为具体的对象
PeopleInfo *peopleInfo = nil;
NSMutableArray *resultArray = [[NSMutableArray alloc] init];
for (NSDictionary *rowDict in result)
{
peopleInfo = [[PeopleInfo alloc] init];
// 使用方法的时候必须model的属性名称和字典的key要保持完全一致
[peopleInfo setValuesForKeysWithDictionary:rowDict];
[resultArray addObject:peopleInfo];
}
NSLog(@"%@", resultArray);
}
}
结果:

至此Sqlite3的集成方法介绍完毕。
[How to]集成SQLite3的更多相关文章
- delphi Sqlite
Delphi中SQLite如何读写二进制字段(Blob类型) 在Delphi中,有大量的组件可以操作SQLite数据库,如UniDAC就是其中一个比较优秀的,当然还有ASQLite3Component ...
- 从零开始用electron整个跨平台桌面应用---基础配置篇
1.安装node.npm node以及npm都需要是最新版本(版本过低有坑) 2.安装淘宝镜像cnpm(建议,下载较快) npm install -g cnpm --registry=https:// ...
- electron 集成 nedb / sqlite3
nedb nedb 无法创建文件 // webpack 构建的前提 externals: process.env.web ? {} : { "nedb": "requir ...
- Python开发入门与实战9-基于vs的集成开发环境
9. 基于visual studio的Python的集成开发环境 上一章我们描述了如何安装使用Java的集成开发环境Eclipse IDE,本章我们来说明另一种集成开发环境,也是笔者多年的开发习惯使用 ...
- 第三十三章 metrics(1) - graphite搭建 + whisper存储模式 + 高精度向低精度聚合方式 + 集成StatsD + 集成grafana
组件介绍: carbon:Carbon实际上是一系列守护进程,组成一个Graphite安装的存储后端.这些守护进程用一个名为Twisted的事件驱动网络引擎监听时间序列数据.Twisted框架让Car ...
- 【解决】Django项目废弃SQLite3拥抱MySQL
SQLite3数据库就一个文件,拷贝着随时带走,调试方便,超级轻量级,有它的好处. 不过,MySQL才是中小项目的主流,最近想把Django里程碑项目部署到SAE上,所以试着把原来的项目数据库替换成M ...
- Android adb使用sqlite3对一个数据库进行sql查询
sqlite是Android下集成的一个轻量级数据库,我们可以通过adb程序进入数据库命令行,对数据进行查询,具体操作如下: ①打开windows的cmd ②输入adb shell.此时进入了该安卓系 ...
- Cloud Foundry中 JasperReports service集成
Cloud Foundry作为业界第一个开源的PaaS解决方案,正越来越多的被业界接受和认可.随着PaaS的发展,Cloud Foundry顺应潮流,充分发挥开源项目的特点,到目前为止,已经支持了大批 ...
- apache+php+mysql常见集成环境安装包
http://www.thinksaas.cn/group/topic/33/ apache+php+mysql是常见php环境,在windows下也称为WAMP,对于初学者自选版本搭建总是会遇到一些 ...
随机推荐
- 【转】C# Datatable排序与取前几行数据
转自:http://www.cnblogs.com/linyechengwei/archive/2010/06/14/1758337.html http://blog.csdn.net/smartsm ...
- 【刷题】BZOJ 3513 [MUTC2013]idiots
Description 给定n个长度分别为a_i的木棒,问随机选择3个木棒能够拼成三角形的概率. Input 第一行T(T<=100),表示数据组数. 接下来若干行描述T组数据,每组数据第一行是 ...
- 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...
- Android 数据库升级中数据保持和导入已有数据库
一.数据库升级: 在我们的程序中,或多或少都会涉及到数据库,使用数据库必定会涉及到数据库的升级,数据库升级带来的一些问题,如旧版本数据库的数据记录的保持,对新表的字段的添加等等一系列问题,还记得当我来 ...
- PHP检测json格式数据
首先要记住json_encode返回的是字符串, 而json_decode返回的是对象 判断数据不是JSON格式: 复制代码代码如下: function is_not_json($str){ ...
- Linux内核中的常用宏container_of其实很简单
http://blog.csdn.net/npy_lp/article/details/7010752 通过一个结构体变量的地址,求该结构体的首地址. #ifndef CONTAINER_OF #de ...
- bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图
[Apio2015]雅加达的摩天楼 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 644 Solved: 238[Submit][Status][D ...
- HDU3585 最大团+二分
maximum shortest distance Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- each jquery
<div class="first"> <span>投保人数:</span> <input type="text" i ...
- linux上抓包
使用tcpdump命令. 使用tcpdump -help查看其用法. -i eth0:在第一块网卡上进行抓包. -w filename.cap:将抓的保存到当前目录下的filename.cap文件中, ...