运行环境:macOS
开发环境:Xcode 9.4
本教程是在Xcode上开发C/C++,并且生成framework库
1.首先去官网下载sqlite3源码
1.1https://www.sqlite.org/download.html
1.2解压得到文件4个文件,shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h。我们需要用到的是sqlite3.c和sqlite3.h这两个文件(sqlite3ext.h这个文件有空可以去看一下它的注释)
2.打开Xcode,"File" -> "New" -> "Project"
3.在弹出的对话框中"Cocoa Touch Framework" -> "Next"
4.填写好"Product Name","Team"(就是苹果账号,没有就先选None),还有下面的公司名称和组织名称,Language选择Object-C
5.此时就创建好了一个新工程,这是新工程的起始界面
6.在工程项目上右键,选择"New Group",修改名字为sqlite3
7.将sqlite3.c和sqlite3.h这两个源文件添加到sqlite3文件夹下,可以直接拖动,在相应位置打上勾
8.最后达到的效果,同时在test这个项目的文件夹中创建了sqlite3文件夹,在这个文件夹下有sqlite3.h和sqlite3.c
9.按照上面的方法,新建一个文件夹,添加2个文件,如下图所示。这两个文件是自己封装sqlite3函数的文件。
10.我们先来测试一下sqlite3.h和舍弃sqlite.c能否使用。我们在myclient.c 中包含#include "sqlite3.h"。
#include "sqlite3.h"
sqlite3 *db;
11.选择模拟器,点击编译。如果没有报错,则添加数据库成功
12.有时候我们按照上面的步骤会报错,是因为程序识别不到“sqlite3.h”这个头文件,这时候我们就要将sqlite3.h和sqlite3.c的位置添加到系统路径中。而上面的步骤不需要是因为我们直接将sqlite3这个文件夹建立在了和工程文件test平级的地方。如果我们改变sqlite3文件夹的位置,将它放在test文件夹的子目录中,再次编译,就会报错了。如下图。
13.接下来我们就可以正式来使用我们的sqlite3数据库了
myclient.h
#ifndef myclient_h
#define myclient_h
#include <stdio.h>
#include <iostream>
using namespace std;
extern void Db_Open(const char *Path); //创建数据库文件
extern void Db_Close(); //关闭数据库
extern void Db_CreateTable(); 创建表
#endif
myclient.c
#include "myclient.h"
#include "sqlite3.h"
static const char * CREATE_TABLE = "create table PracticeTable (Name varchar(128),Value varchar(128),Owner varchar(128));";
static sqlite3 *db;
char OutBuf[256] = {0};
//创建一个数据库文件
void Db_Open(const char *path)
{
int res = sqlite3_open(path,&db);
if(res != SQLITE_OK)
{
sqlite3_close(db);
throw string(path) + "open failed:" + sqlite3_errmsg(db);
}
}
//关闭数据库
void Db_Close()
{
sqlite3_close(db);
db = NULL;
}
//设置一个回调函数
static int select_callback(void *para,int argc, char **argv, char **col)
{
strncpy((char *)para, argv[argc-1],sizeof(OutBuf)-1);
return 0;
}
//设置ecex函数
void Db_Exec(const char *sql)
{
char *errmsg;
if(NULL == db)
{
throw "本地数据库未打开";
}
int res = sqlite3_exec(db, sql, select_callback, (void *)OutBuf, &errmsg);
if(res != SQLITE_OK)
{
string temp_msg;
temp_msg = string("ErrMsg:") + errmsg;
sqlite3_free(errmsg);
throw temp_msg;
}
}
//创建表
void Db_CreateTable()
{
try{
Db_Exec(CREATE_TABLE);
}catch(string &e){
throw e;
}
}
14.封装好几本的函数后,我们就可以来用了。修改testTests.m为testTests.mm(.mm文件表示可以obj-c后c/c++可以混合编程)。在里面包含头文件“myclient.h”.
#import <XCTest/XCTest.h>
#include "myclient.h" //新增
@interface testTests : XCTestCase
@end
@implementation testTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
Db_Open("./test.db"); //新增
Db_CreateTable(); //新增
}
@end
一共添加了3句代码,别的都是自带的。注意添加代码的位置。
15.project -> test
会看到test success
同时去"/Users/tuweiguang/Library/Developer/CoreSimulator/Devices/1DA6D86F-C605-46EA-B7F3-147DC67FAAFD/data"这个目录下就可以看到创建的test.db数据库文件了。至于为什么“./test.db”在当前目录下创建的文件会在这个目录下产生,因为ios有一个沙盒的概念。这个概念只能自己搜索了。
16.如果test不成功,且错误信息显示x86什么的,先仔细检查一下.mm, .c, .h文件中的函数名是否相同。如果相同,再去先查下图的位置。
检查sqlite3.c, sqlite3.h, myclient.c, myclient.h是否都添加了。没添加点一下+就可以添加了。应该就没什么问题了。
最后,数据库的移植就到这里,具体对数据库的封装可以看看别人的博客,反正我也是借鉴学习别人的。如果在移植方面还有什么问题的话,欢迎留言。
下一遍,在xcode中移植expat