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

猜你喜欢

转载自blog.csdn.net/qq_34759481/article/details/81218259