運行環境: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