cocos2dx sqlite第三方庫的資源儲存和調用

來源:互聯網
上載者:User

標籤:cocos2dx sqlite3

sqlite3是一個簡單的前端資料庫,對於一些動作和前段儲存資料比較多的遊戲使用還是很方便



#ifndef __Sqlite3Test__DataBaseHelper__

#define __Sqlite3Test__DataBaseHelper__


#include <iostream>


#include "sqlite3.h"

#include <vector>

#include <string>


#define DBNOTFOUND INT_MAX


class DataBaseHelper

{     //=====資料庫操作手柄======

public:

    static DataBaseHelper* sharedDataBaseHelper();

    ~DataBaseHelper();

    int countForTable(constchar * table);

    sqlite3_stmt * queryTable(const char * table, const char *fields,const char *condition, int offset=0, int count=0);

    static void destroy();

    void openSqliteInAndroid();

    

private:

    DataBaseHelper();

    static DataBaseHelper *dataBaseHelper;

    sqlite3 *database;

};



template <class T>

class DataBaseTable

{   //資料庫表類

protected:

    DataBaseTable(){}

    virtual void parseStatement(sqlite3_stmt *) =0;

public:

    static T findDataById(int tid)

    {    //=====根據ID找到資料=======

        char condition[20];

        sprintf(condition, "id=%d", tid);

        sqlite3_stmt * stmt = DataBaseHelper::sharedDataBaseHelper()->queryTable(T::tableName(),NULL, condition,0,1);

        T t;

        t._id = DBNOTFOUND;

        if ((sqlite3_step(stmt)==SQLITE_ROW))

        {

            t.parseStatement(stmt);

        }

        sqlite3_finalize(stmt);

        return t;

    }

    

    

    static T findDataByTmp(constchar *tmp,int tid)

    {

        char condition[30];

        sprintf(condition, "%s=%d",tmp,tid); //根據條件判斷

        sqlite3_stmt * stmt = DataBaseHelper::sharedDataBaseHelper()->queryTable(T::tableName(),NULL, condition);

        T t;

        //        t._id = DBNOTFOUND;

        if ((sqlite3_step(stmt)==SQLITE_ROW))

        {

            t.parseStatement(stmt);

        }

        sqlite3_finalize(stmt);

        return t;

    }

    

    

    

    static T findDataByIdAndName(int tid,const char* name)

    { //根據ID和名字找到資料

        char condition[30];

        sprintf(condition, "id=%d and name=‘%s‘", tid, name);

        sqlite3_stmt * stmt = DataBaseHelper::sharedDataBaseHelper()->queryTable(T::tableName(),NULL, condition);

        T t;

        t._id = DBNOTFOUND;

        if ((sqlite3_step(stmt)==SQLITE_ROW))

        {

            t.parseStatement(stmt);

        }

        sqlite3_finalize(stmt);

        return t;

    }

    //vector容器模板拿到資料

    static std::vector<T> findData(constchar *condition=NULL, int offset=0, int count=0)

    {

        std::vector<T> res;

        sqlite3_stmt * stmt = DataBaseHelper::sharedDataBaseHelper()->queryTable(T::tableName(),NULL, condition);

        while ((sqlite3_step(stmt)==SQLITE_ROW))

        {

            T t;

            t.parseStatement(stmt);

            res.push_back(t);

        }

        sqlite3_finalize(stmt);

        return res;

    }

    

    

    static int count()

    {      //返回資料庫表的大小

        return DataBaseHelper::sharedDataBaseHelper()->countForTable(T::tableName());

    }

};



#endif /* defined(__Sqlite3Test__DataBaseHelper__) */





#include "DataBaseHelper.h"

#include <string>

#include "../CCFileUtils.h"

#include <stdlib.h>

#include <stdio.h>

#include "cocos2d.h"



using namespace std;

using namespace cocos2d;


DataBaseHelper *DataBaseHelper::dataBaseHelper = NULL;


DataBaseHelper::DataBaseHelper()

{

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

//如果在IOS平台需要開啟相應的資料庫路徑

    std::string path = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename("data/gameDataBean.db");

    CCLog("------%s-------------",path.c_str());

int res = sqlite3_open(path.c_str(), &database);

    if (res != SQLITE_OK)

    {

        CCLog("-->>open db fail,error code is %d", res);

    }

    

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    openSqliteInAndroid();

#endif

    

}


void DataBaseHelper::openSqliteInAndroid()

{

    // android 系統不能對assets目錄下的檔案進行fopen操作,所以copy到 /data/data/包名/files/下面再操作

    std::string path = cocos2d::CCFileUtils::sharedFileUtils()->fullPathForFilename("data/gameDataBean.db");

    std::string writalePath = CCFileUtils::sharedFileUtils()->getWritablePath() +"gameDataBean.db";

    

    unsigned long len =0;

    unsigned char *data =NULL;

    

    data = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(),"r", &len);

    

    FILE *fp = fopen(writalePath.c_str(),"r");

    if(!fp)

    {

        // 資料庫存在的話就別再copy過去了

        FILE *fp1 = fopen(writalePath.c_str(), "w+");

        fwrite(data, sizeof(char), len, fp1);

        fclose(fp1);

    } else{

        fclose(fp);

    }

    

    

int res = sqlite3_open(writalePath.c_str(), &database);

    if (res != SQLITE_OK)

    {

        CCLog("-->>open db fail,error code is %d", res);

    }

}


DataBaseHelper* DataBaseHelper::sharedDataBaseHelper() {

    if (!dataBaseHelper) {

        dataBaseHelper = new DataBaseHelper();

        ::atexit(destroy);

    }

    return dataBaseHelper;

}


void DataBaseHelper::destroy()

{

    if (dataBaseHelper)

    {

        delete dataBaseHelper;

    }

}


DataBaseHelper::~DataBaseHelper()

{

    sqlite3_close(database);

}

int DataBaseHelper::countForTable(constchar * table) {  //返回表的數量

    char *sql = (char *)malloc(strlen(table)+22);

    int count = -1;

    sprintf(sql, "select count(*) from %s", table);

    

// 在sqlite中並沒有定義sqlite3_stmt這個結構的具體內容,它只是一個抽象類別型,在使用過程中一般以它的指標進行操作,

//而sqlite3_stmt類型的指標在實際上是一個指向Vdbe的結構體得指標

    sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(database, sql, -1, &statement,NULL)==SQLITE_OK) {  //sqlite3_prepare_v2 查詢資料庫介面

        if (sqlite3_step(statement)==SQLITE_ROW)

        {

            count = sqlite3_column_int(statement, 0);

        }

    }

    free(sql);

    return count;

}


//查詢表

sqlite3_stmt * DataBaseHelper::queryTable(constchar * table, const char *fields, const char *condition,int offset, int count)

{

    string sql = string("select ");

    if (fields) {

        sql.append(fields);

    } else {

        sql.append("*");

    }

    sql.append(" from ");

    sql.append(table);

    if (condition) {

        sql.append(" where ");

        sql.append(condition);

    }

    

    if (count)

    {

        sql.append(" limit ");

        char tmp[20];

        sprintf(tmp, "%d,%d", offset, count);

        sql.append(tmp);

    }

    sql.append(";");

// sqlite3_stmt   它是一個已經把sql語句解析了的、用sqlite自已標幟記錄的內部資料結構。

    sqlite3_stmt *statement;

    

    if (sqlite3_prepare_v2(database, sql.c_str(), -1, &statement,NULL)==SQLITE_OK) {

        return statement;

    }

    return NULL;

}


cocos2dx sqlite第三方庫的資源儲存和調用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.