xcode移植sqlite3數據庫

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章