数据库 --> sqlite3之api使用

本文详细介绍了如何创建和管理一个用于存储笔记、图片、录音等信息的memo数据库,包括数据库初始化、表创建、权限设置及核心操作方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建

if [ ! -d /opt/dbspace ]
then
    mkdir /opt/dbspace
fi

if [ -f /opt/dbspace/.memo.db ]
then
    rm /opt/dbspace/.memo.db;
fi

if [ -f /opt/dbspace/.memo.db-journal ]
then
    rm /opt/dbspace/.memo.db-journal
fi


sqlite3 /opt/dbspace/.memo.db 'PRAGMA journal_mode = PERSIST;
    create  table memo_list (
    memo_id INTEGER PRIMARY KEY AUTOINCREMENT,
    is_selected INTEGER default 0,
    time  INTEGER default 0,
    year  INTEGER default 0,
    month  INTEGER default 0,
    day  INTEGER default 0,
    hour  INTEGER default 0,
    minute  INTEGER default 0,
    wday  INTEGER default 0,
    thumb_path TEXT NOT NULL,
    memo_text TEXT,
    image_path TEXT,
    image_x INTEGER,
    image_y INTEGER,
    image_w INTEGER,
    image_h INTEGER,
    handwrite_path TEXT,
    record_path TEXT,
    record_length INTEGER,
    UNIQUE (memo_id)
    );
'

chown :5000 /opt/dbspace/.memo.db
chown :5000 /opt/dbspace/.memo.db-journal
chmod 660 /opt/dbspace/.memo.db
chmod 660 /opt/dbspace/.memo.db-journal
chsmack -a 'memo::db' /opt/dbspace/.memo.db*
View Code

 

cmake

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(memo-database CXX)

INCLUDE(FindPkgConfig)
pkg_check_modules(pkgs REQUIRED
        sqlite3
        dlog
)

INCLUDE_DIRECTORIES(${pkgs_INCLUDE_DIRS})
LINK_DIRECTORIES(${pkgs_LIBRARY_DIRS})

FOREACH(flag ${pkgs_CFLAGS})
    SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)

SET(CMAKE_CXX_FLAGS "${EXTRA_CFLAGS} -O2 -Wall -Wcast-align -Wcast-qual -Werror -Wextra -Wnon-virtual-dtor -Wno-unused-parameter -Wshadow -Wwrite-strings -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-strict-aliasing -fsigned-char -fstrict-overflow -Wno-ignored-qualifiers -Wno-array-bounds -Wno-empty-body -Wno-error")

SET(LIB_NAME "${PROJECT_NAME}")
SET(LIB_PREFIX ${CMAKE_INSTALL_PREFIX})
SET(LIB_DIR "${LIB_PREFIX}/lib")
SET(LIB_INCLUDE_DIR "${LIB_PREFIX}/include")
SET(LIB_PKGCONFIG_DIR "/usr/lib/pkgconfig")

SET(SRCS
    src/MemoDb.cpp
)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)

ADD_LIBRARY( ${LIB_NAME} SHARED ${SRCS} )
TARGET_LINK_LIBRARIES(${LIB_NAME} ${pkgs_LDFLAGS})

CONFIGURE_FILE(${LIB_NAME}.pc.in ${LIB_NAME}.pc @ONLY)
INSTALL(TARGETS ${LIB_NAME} DESTINATION ${LIB_DIR})
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}.pc DESTINATION ${LIB_PKGCONFIG_DIR})
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/MemoDb.h DESTINATION ${LIB_INCLUDE_DIR} )
View Code

 

spec

Name: memo-database
Summary: app control api
Version: 0.1.1
Release: 1
License: Flora License
Source0: %{name}-%{version}.tar.gz

BuildRequires:    cmake
BuildRequires:  pkgconfig(sqlite3)
BuildRequires:  pkgconfig(dlog)
Provides: libmemo-database.so

%description
App Control API Library

%package devel
Summary: app control api (devel)
Requires: %{name} = %{version}

%description devel
App Control API devel package

%prep
%setup -q

%build
cmake . -DVERSION=%{version} \
    -DCMAKE_INSTALL_PREFIX=%{_prefix}

make %{?jobs:-j%jobs}

%install
%make_install


%files
%{_libdir}/*.so
%manifest memo-database.manifest

%files devel
%{_libdir}/pkgconfig/%{name}.pc
%{_includedir}/*

%post
/sbin/ldconfig

if [ ! -d /opt/dbspace ]
then
    mkdir /opt/dbspace
fi

if [ -f /opt/dbspace/.memo.db ]
then
    rm /opt/dbspace/.memo.db;
fi

if [ -f /opt/dbspace/.memo.db-journal ]
then
    rm /opt/dbspace/.memo.db-journal
fi


sqlite3 /opt/dbspace/.memo.db 'PRAGMA journal_mode = PERSIST;
    create  table memo_list (
    memo_id INTEGER PRIMARY KEY AUTOINCREMENT,
    is_selected INTEGER default 0,
    time  INTEGER default 0,
    year  INTEGER default 0,
    month  INTEGER default 0,
    day  INTEGER default 0,
    hour  INTEGER default 0,
    minute  INTEGER default 0,
    wday  INTEGER default 0,
    thumb_path TEXT NOT NULL,
    memo_text TEXT,
    image_path TEXT,
    image_x INTEGER,
    image_y INTEGER,
    image_w INTEGER,
    image_h INTEGER,
    handwrite_path TEXT,
    record_path TEXT,
    record_length INTEGER,
    UNIQUE (memo_id)
    );
'

chown :5000 /opt/dbspace/.memo.db
chown :5000 /opt/dbspace/.memo.db-journal
chmod 660 /opt/dbspace/.memo.db
chmod 660 /opt/dbspace/.memo.db-journal
chsmack -a 'memo::db' /opt/dbspace/.memo.db*
View Code

 

 

头文件

#ifndef __MEMO_DB_H__
#define __MEMO_DB_H__

#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <sqlite3.h>

using std::vector;

#define DBDIR "/opt/dbspace"
#define DBFILE ".memo.db"
#define DBPATH DBDIR"/"DBFILE
#define MEMO_EMPTY_STR ""
#define MEMO_CHECK_STR(p) ((p) ? (p) : MEMO_EMPTY_STR)

typedef enum _memo_db_error
{
    MEMO_ERROR_NONE = 0,/**< Success */
    MEMO_ERROR_INVALID_DATA = -1,/**< Invalid parameter */
    MEMO_ERROR_NO_MEMORY = -2,/**< No memory */
    MEMO_ERROR_FROM_DB = -3,/**< Error from DB query */
    MEMO_ERROR_ALREADY_EXIST_ID = -4,/**< Already exist private ID */
    MEMO_ERROR_FROM_DBUS = -5,/**< Error from DBus */
    MEMO_ERROR_NOT_EXIST_ID = -6,/**< Not exist private ID */
    MEMO_ERROR_IO = -7,/**< disk i/o error */
    MEMO_ERROR_SERVICE_NOT_READY = -8,/**< no reponse from master */
} memo_db_error_e;

typedef struct
{
    int nMemoId;
    bool bIsSelected;
    long int nTime;
    int nYear;
    int nMonth;
    int nDay;
    int nHour;
    int nMinute;
    int nWeekday;
    const char *strThumbPath;
    const char *strMemoText;
    char *strImagePath;
    int nImageX;
    int nImageY;
    int nImageW;
    int nImageH;
    const char *strHandwritePath;
    const char *strRecordPath;
    int nRecordLength;
}MemoDbData;


class CMemoDb
{
public:
    CMemoDb() {};
    virtual ~CMemoDb() {};

    int OpenMemoDb();
    int CloseMemoDb();

    int InsertMemoDb(MemoDbData *MemoData);
    int UpdateMemoDb(MemoDbData *MemoData);
    int DelMemoDb(int nMemoId);
    int GetDataFromDb(vector<MemoDbData> *MemoVector);
    int GetDataById(int nMemoId, MemoDbData *MemoData);
    static CMemoDb* GetInstance();
    int GetFirstData(MemoDbData *MemoData);
    int GetTop3Memo(vector<MemoDbData> *MemoVector);

private:
    int m_ExecMemoDb(const char *query);
    char *m_GetColumnText(sqlite3_stmt *stmt, int col);
    static CMemoDb* m_pMemoDbInstance;
    sqlite3 *db;
};

#endif/* __EPG_DB_H__ */
View Code

 

src文件

#include "MemoDb.h"
#include "dbg.h"

CMemoDb* CMemoDb::m_pMemoDbInstance = NULL;

CMemoDb* CMemoDb::GetInstance()
{
    if(m_pMemoDbInstance == NULL)
    {
        m_pMemoDbInstance = new CMemoDb();
    }

    return m_pMemoDbInstance;
}

int CMemoDb::OpenMemoDb()
{
    _DBG("OpenMemoDb------------------------------0");

    int ret = 0;

    ret = sqlite3_open(DBPATH, &db);
    if (ret != SQLITE_OK)
    {
        _ERR("DB open error(%d), %s", ret, DBPATH);
        return -1;
    }
    _DBG("OpenMemoDb------------------------------1");

    return 0;
}

int CMemoDb::CloseMemoDb()
{
    int ret = 0;

    if (!db)
    {
        return MEMO_ERROR_INVALID_DATA;
    }

    ret = sqlite3_close(db);
    if (ret != SQLITE_OK)
    {
        _ERR("DB close error(%d)", ret);
        return MEMO_ERROR_FROM_DB;
    }

    db = NULL;

    _DBG("CloseMemoDb################################");
    return MEMO_ERROR_NONE;
}

int CMemoDb::m_ExecMemoDb( const char *query)
{
    _DBG("m_ExecMemoDb,  query is %s", query);
    int ret = 0;
    char *err_msg = NULL;

    if (!db)
    {
        return MEMO_ERROR_INVALID_DATA;
    }

    ret = sqlite3_exec(db, query, NULL, NULL, &err_msg);

    if (ret != SQLITE_OK)
    {
        _ERR("SQL error(%d) : %s", ret, err_msg);
        sqlite3_free(err_msg);
        return MEMO_ERROR_FROM_DB;
    }
    _DBG("m_ExecMemoDb finish");
    return MEMO_ERROR_NONE;
}

char *CMemoDb::m_GetColumnText(sqlite3_stmt *stmt, int col)
{
    const unsigned char *col_text = NULL;

    col_text = sqlite3_column_text(stmt, col);
    if (!col_text || col_text[0] == '\0')
    {
        return NULL;
    }

    return strdup((char *)col_text);
}

int CMemoDb::InsertMemoDb(MemoDbData *MemoData)
{
    _DBG("InsertMemoDb");
    char *query = NULL;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("insert into memo_list("
            "memo_id, is_selected, "
            "time, year, month, day, hour, minute, wday, "
            "thumb_path, memo_text, image_path, "
            "image_x, image_y, image_w, image_h, "
            "handwrite_path, "
            "record_path,record_length) values ("
            "null, %d, "
            "%ld, %d, %d, %d, %d, %d, %d, "
            "'%s', '%s', '%s', "
            "%d, %d, %d, %d, "
            "'%s', "
            "'%s', %d)",
            MemoData->bIsSelected,
            MemoData->nTime,
            MemoData->nYear,
            MemoData->nMonth,
            MemoData->nDay,
            MemoData->nHour,
            MemoData->nMinute,
            MemoData->nWeekday,
            MemoData->strThumbPath,
            MemoData->strMemoText,
            MemoData->strImagePath,
            MemoData->nImageX,
            MemoData->nImageY,
            MemoData->nImageW,
            MemoData->nImageH,
            MemoData->strHandwritePath,
            MemoData->strRecordPath,
            MemoData->nRecordLength);

    if (m_ExecMemoDb((const char *)query) != MEMO_ERROR_NONE)
    {
            return MEMO_ERROR_FROM_DB;
    }

    return MEMO_ERROR_NONE;
}


int CMemoDb::UpdateMemoDb(MemoDbData *MemoData)
{
    _DBG("here should implement");
    char *query = NULL;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("update memo_list set "
            "is_selected = %d, "
            "time = %ld, year = %d, month = %d, day = %d, hour = %d, minute = %d, wday = %d, "
            "thumb_path = '%s', memo_text = '%s', image_path = '%s', "
            "image_x = %d, image_y = %d, image_w = %d, image_h = %d, "
            "handwrite_path = '%s', "
            "record_path = '%s', record_length = %d "
            "where memo_id = %d",
            MemoData->bIsSelected,
            MemoData->nTime,
            MemoData->nYear,
            MemoData->nMonth,
            MemoData->nDay,
            MemoData->nHour,
            MemoData->nMinute,
            MemoData->nWeekday,
            MemoData->strThumbPath,
            MemoData->strMemoText,
            MemoData->strImagePath,
            MemoData->nImageX,
            MemoData->nImageY,
            MemoData->nImageW,
            MemoData->nImageH,
            MemoData->strHandwritePath,
            MemoData->strRecordPath,
            MemoData->nRecordLength,
            MemoData->nMemoId);

    if (m_ExecMemoDb((const char *)query) != MEMO_ERROR_NONE)
    {
        return MEMO_ERROR_FROM_DB;
    }

    return MEMO_ERROR_NONE;
}
int CMemoDb::DelMemoDb(int nMemoId)
{
    char *query = NULL;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("delete from memo_list where memo_id = %d",
            nMemoId);

    if (m_ExecMemoDb( query) != MEMO_ERROR_NONE)
    {
        return MEMO_ERROR_FROM_DB;
    }

    return MEMO_ERROR_NONE;
}

int CMemoDb::GetDataById(int nMemoId, MemoDbData *MemoData)
{
    sqlite3_stmt *stmt;
    char *query = NULL;
    int ret;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("select memo_id, is_selected, "
            "time, year, month, day, hour, minute, wday, "
            "thumb_path, "
            "memo_text, "
            "image_path, "
            "image_x, "
            "image_y, "
            "image_w, "
            "image_h, "
            "handwrite_path, "
            "record_path, "
            "record_length "
            "from memo_list where memo_id = %d", nMemoId);

    ret = sqlite3_prepare(db, query, strlen(query), &stmt, NULL);
    if (ret != SQLITE_OK)
    {
        _ERR("Get count DB err(%d) : %s", ret, sqlite3_errmsg(db));
        return MEMO_ERROR_FROM_DB;
    }

    if (sqlite3_step(stmt) == SQLITE_ROW)
    {
        MemoData->bIsSelected = sqlite3_column_int(stmt, 1);
        MemoData->nTime = sqlite3_column_int(stmt, 2);
        MemoData->nYear = sqlite3_column_int(stmt, 3);
        MemoData->nMonth = sqlite3_column_int(stmt, 4);
        MemoData->nDay = sqlite3_column_int(stmt, 5);
        MemoData->nHour = sqlite3_column_int(stmt, 6);
        MemoData->nMinute = sqlite3_column_int(stmt, 7);
        MemoData->nWeekday = sqlite3_column_int(stmt, 8);
        MemoData->strThumbPath = m_GetColumnText(stmt, 9);
        MemoData->strMemoText= m_GetColumnText(stmt, 10);
        MemoData->strImagePath = m_GetColumnText(stmt, 11);
        MemoData->nImageX = sqlite3_column_int(stmt, 12);
        MemoData->nImageY = sqlite3_column_int(stmt, 13);
        MemoData->nImageW = sqlite3_column_int(stmt, 14);
        MemoData->nImageH = sqlite3_column_int(stmt, 15);
        MemoData->strHandwritePath = m_GetColumnText(stmt, 16);
        MemoData->strRecordPath = m_GetColumnText(stmt, 17);
        MemoData->nRecordLength= sqlite3_column_int(stmt, 18);
    }

    sqlite3_finalize(stmt);

    return MEMO_ERROR_NONE;
}

int CMemoDb::GetDataFromDb(vector<MemoDbData> *MemoVector)
{
    sqlite3_stmt *stmt;
    char *query = NULL;
    MemoDbData MemoData;
    int ret;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("select memo_id, is_selected, "
            "time, year, month, day, hour, minute, wday, "
            "thumb_path, "
            "memo_text, "
            "image_path, "
            "image_x, "
            "image_y, "
            "image_w, "
            "image_h, "
            "handwrite_path, "
            "record_path, "
            "record_length "
            "from memo_list order by time desc");

    ret = sqlite3_prepare(db, query, strlen(query), &stmt, NULL);
    if (ret != SQLITE_OK)
    {
        _ERR("Get count DB err(%d) : %s", ret, sqlite3_errmsg(db));
        return MEMO_ERROR_FROM_DB;
    }

    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        MemoData.nMemoId = sqlite3_column_int(stmt , 0);
        MemoData.bIsSelected = sqlite3_column_int(stmt, 1);
        MemoData.nTime = sqlite3_column_int(stmt, 2);
        MemoData.nYear = sqlite3_column_int(stmt, 3);
        MemoData.nMonth = sqlite3_column_int(stmt, 4);
        MemoData.nDay = sqlite3_column_int(stmt, 5);
        MemoData.nHour = sqlite3_column_int(stmt, 6);
        MemoData.nMinute = sqlite3_column_int(stmt, 7);
        MemoData.nWeekday = sqlite3_column_int(stmt, 8);
        MemoData.strThumbPath = m_GetColumnText(stmt, 9);
        MemoData.strMemoText= m_GetColumnText(stmt, 10);
        MemoData.strImagePath = m_GetColumnText(stmt, 11);
        MemoData.nImageX = sqlite3_column_int(stmt, 12);
        MemoData.nImageY = sqlite3_column_int(stmt, 13);
        MemoData.nImageW = sqlite3_column_int(stmt, 14);
        MemoData.nImageH = sqlite3_column_int(stmt, 15);
        MemoData.strHandwritePath = m_GetColumnText(stmt, 16);
        MemoData.strRecordPath = m_GetColumnText(stmt, 17);
        MemoData.nRecordLength= sqlite3_column_int(stmt, 18);

        MemoVector->push_back(MemoData);
    }

    sqlite3_finalize(stmt);

    return MEMO_ERROR_NONE;
}

int CMemoDb::GetFirstData(MemoDbData *MemoData)
{
    sqlite3_stmt *stmt;
    char *query = NULL;
    int ret;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("select memo_id, is_selected, "
            "time, year, month, day, hour, minute, wday, "
            "thumb_path, "
            "memo_text, "
            "image_path, "
            "image_x, "
            "image_y, "
            "image_w, "
            "image_h, "
            "handwrite_path, "
            "record_path, "
            "record_length "
            "from memo_list  order by time desc");

    ret = sqlite3_prepare(db, query, strlen(query), &stmt, NULL);
    if (ret != SQLITE_OK)
    {
        _ERR("Get count DB err(%d) : %s", ret, sqlite3_errmsg(db));
        return MEMO_ERROR_FROM_DB;
    }

    if (sqlite3_step(stmt) == SQLITE_ROW)
    {
        MemoData->bIsSelected = sqlite3_column_int(stmt, 1);
        MemoData->nTime = sqlite3_column_int(stmt, 2);
        MemoData->nYear = sqlite3_column_int(stmt, 3);
        MemoData->nMonth = sqlite3_column_int(stmt, 4);
        MemoData->nDay = sqlite3_column_int(stmt, 5);
        MemoData->nHour = sqlite3_column_int(stmt, 6);
        MemoData->nMinute = sqlite3_column_int(stmt, 7);
        MemoData->nWeekday = sqlite3_column_int(stmt, 8);
        MemoData->strThumbPath = m_GetColumnText(stmt, 9);
        MemoData->strMemoText= m_GetColumnText(stmt, 10);
        MemoData->strImagePath = m_GetColumnText(stmt, 11);
        MemoData->nImageX = sqlite3_column_int(stmt, 12);
        MemoData->nImageY = sqlite3_column_int(stmt, 13);
        MemoData->nImageW = sqlite3_column_int(stmt, 14);
        MemoData->nImageH = sqlite3_column_int(stmt, 15);
        MemoData->strHandwritePath = m_GetColumnText(stmt, 16);
        MemoData->strRecordPath = m_GetColumnText(stmt, 17);
        MemoData->nRecordLength= sqlite3_column_int(stmt, 18);
    }

    sqlite3_finalize(stmt);


    return MEMO_ERROR_NONE;
}

int CMemoDb::GetTop3Memo(vector<MemoDbData> *MemoVector)
{
    sqlite3_stmt *stmt;
    char *query = NULL;
    MemoDbData MemoData;
    int ret;

    if (!db)
    {
        return MEMO_ERROR_FROM_DB;
    }

    query = sqlite3_mprintf("select memo_id, is_selected, "
            "time, year, month, day, hour, minute, wday, "
            "thumb_path, "
            "memo_text, "
            "image_path, "
            "image_x, "
            "image_y, "
            "image_w, "
            "image_h, "
            "handwrite_path, "
            "record_path, "
            "record_length "
            "from memo_list where is_selected = 1 order by time desc");

    ret = sqlite3_prepare(db, query, strlen(query), &stmt, NULL);
    if (ret != SQLITE_OK)
    {
        _ERR("Get count DB err(%d) : %s", ret, sqlite3_errmsg(db));
        return MEMO_ERROR_FROM_DB;
    }

    while(sqlite3_step(stmt) == SQLITE_ROW)
    {
        MemoData.nMemoId = sqlite3_column_int(stmt , 0);
        MemoData.bIsSelected = sqlite3_column_int(stmt, 1);
        MemoData.nTime = sqlite3_column_int(stmt, 2);
        MemoData.nYear = sqlite3_column_int(stmt, 3);
        MemoData.nMonth = sqlite3_column_int(stmt, 4);
        MemoData.nDay = sqlite3_column_int(stmt, 5);
        MemoData.nHour = sqlite3_column_int(stmt, 6);
        MemoData.nMinute = sqlite3_column_int(stmt, 7);
        MemoData.nWeekday = sqlite3_column_int(stmt, 8);
        MemoData.strThumbPath = m_GetColumnText(stmt, 9);
        MemoData.strMemoText= m_GetColumnText(stmt, 10);
        MemoData.strImagePath = m_GetColumnText(stmt, 11);
        MemoData.nImageX = sqlite3_column_int(stmt, 12);
        MemoData.nImageY = sqlite3_column_int(stmt, 13);
        MemoData.nImageW = sqlite3_column_int(stmt, 14);
        MemoData.nImageH = sqlite3_column_int(stmt, 15);
        MemoData.strHandwritePath = m_GetColumnText(stmt, 16);
        MemoData.strRecordPath = m_GetColumnText(stmt, 17);
        MemoData.nRecordLength= sqlite3_column_int(stmt, 18);

        MemoVector->push_back(MemoData);
    }

    sqlite3_finalize(stmt);

    return MEMO_ERROR_NONE;
}
View Code

 

转载于:https://www.cnblogs.com/jeakeven/p/4885402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值