sqlite数据库操作类使用说明-基础篇

sqlite数据库操作类使用说明-基础篇

本文主要演示sqlite数据库类的基础用法。

本篇数据库类使用c++进行封装,但导出了C语言接口,本文测试代码使用的是C语言用法,c++用法基本一致,集成了一些常用的宏定义以及不常用的宏定义用法。
先上测试代码:

#include <Wdebug.h>
#include <stdio.h>

#include <sqlite/Wsqlite.h>
#include <stdlib.h>

#define		TABLE_NAME		"TEST_base"

extern int callback(void* pdata, int argc, char** argv, char** azColName);

void test_base(int argc, char* argv[])
{
  struct TsqlQuery* parse = NULL;
  struct TsqlCtrl* This = CreateSqlCtrl("database.db");
  if (This != NULL) {
  	Wlog("创建表");
  	TsqlCtrlExec (This, SQLCMD_DROP_TABLE(TABLE_NAME), NULL, NULL);
  	TsqlCtrlExec(This, SQLCMD_CREATE_TABLE(TABLE_NAME,
  	"ID INTEGER PRIMARY KEY  AUTOINCREMENT, "
      "NAME           TEXT    NOT NULL, "
      "AGE            INT     NOT NULL, "
      "ADDRESS        CHAR(50), "
      "SALARY         REAL"), NULL, NULL);
  	Wlog ("字段AGE:%s", TsqlCtrlCheckField(This, TABLE_NAME, "AGE")?"存在":"不存在");
  	Wlog ("字段AAAAAA:%s", TsqlCtrlCheckField(This, TABLE_NAME, "AAAAAA")?"存在":"不存在");

  	//Wlog ("查询索引:%d", TsqlCtrlRecordCnt(This, "SELECT COUNT(*) AS Cnt FROM sqlite_master WHERE type='index' AND name='test_idx'"));
  	if (TsqlCtrlRecordCnt(This, SQLCMD_IDX_EXIST("test_idx"))==0) {//判断索引是否存在
  		Wlog ("创建索引!");
  		TsqlCtrlExec(This, SQLCMD_CREATE_IDX(TABLE_NAME, "test_idx", "ID"), NULL, NULL);
  	}

  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME" (ID,NAME,AGE,ADDRESS,SALARY) VALUES(1, '张三', 18, '珠海', 2500.0);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME" (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '李四', 21, '广州', 6080.0);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME" (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '啊五', 30, '深圳', 10800.0);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME" (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小哀', 10, '珠海', 0.0);", NULL, NULL);
  	TsqlCtrlExec(This, "SELECT * FROM "TABLE_NAME " WHERE AGE>10;", callback, NULL);
  	Wlog ("record=%d", TsqlCtrlRecordCnt (This, SQLCMD_RECORDCNT(TABLE_NAME)));
  	//TUint32 RecordCnt =  TsqlCtrlRecordCnt (This, SQLCMD_RECORDCNT(TABLE_NAME));
  	TsqlCtrlExec(This, "UPDATE " TABLE_NAME " SET AGE=31 WHERE NAME='啊五'", NULL, NULL);
  	TsqlCtrlExec(This, "SELECT AGE, NAME FROM "TABLE_NAME, callback, NULL);
  	TsqlCtrlExec(This, "DELETE FROM "TABLE_NAME" WHERE SALARY<3000.0", NULL, NULL);
  	TsqlCtrlExec(This, "SELECT NAME, AGE FROM "TABLE_NAME " WHERE ID>0;", callback, NULL);
  	Wlog("当前记录数为:%d", TsqlCtrlRecordCnt(This, "SELECT COUNT(*) AS Cnt FROM "TABLE_NAME));
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME " (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小刘', 28, '梅州', 8500.32);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME" (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小张', 29, '深圳', 7500.25);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME " (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小雪', 40, '广州', 10080.46);", NULL, NULL);
  	Wlog("当前记录数为:%d", TsqlCtrlRecordCnt(This, "SELECT COUNT(*) AS Cnt FROM "TABLE_NAME));
  	TsqlCtrlExec(This, "SELECT * FROM "TABLE_NAME, callback, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME " (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '小吴', 23, '上海', 9600.0);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME " (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '阿奇', 35, '北京', 8500.21);", NULL, NULL);
  	TsqlCtrlExec(This, "INSERT INTO "TABLE_NAME " (ID,NAME,AGE,ADDRESS,SALARY) VALUES(NULL, '志勇', 29, '长沙', 6800.69);", NULL, NULL);
  	TsqlCtrlExec(This, "SELECT * FROM "TABLE_NAME " WHERE SALARY>3000.0;", callback, NULL);
  	parse = TsqlCtrlQuery(This, "SELECT * FROM "TABLE_NAME " WHERE SALARY>3000.0;");
  	if (parse) {
  		Wlog("跳转到记录2!");
  		TsqlQueryBegin (parse);
  		TsqlQueryNext (parse);
  		TsqlQueryNext (parse);
  		Wlog("记录2 NAME = %s", TsqlQueryGetString(parse, "NAME", ""));
  		Wlog("下一条记录:%d", TsqlQueryNext(parse));
  		Wlog("记录3 NAME = %s", TsqlQueryGetString(parse, "NAME", ""));
  		Wlog("记录3 SALARY = %lf", TsqlQueryGetFloat(parse, "SALARY", 0.0));
  		Wlog("上一条记录:%d", TsqlQueryLast(parse));
  		Wlog("记录2 NAME = %s", TsqlQueryGetString(parse, "NAME", ""));
  		Wlog("记录2 SALARY = %f", TsqlQueryGetFloat(parse, "SALARY", 0.0));
  		Wlog("跳到首记录");
  		TsqlQueryBegin(parse);
  		Wlog("记录0 NAME = %s", TsqlQueryGetString(parse, "NAME", ""));
  		Wlog("记录0 SALARY = %f", TsqlQueryGetFloat(parse, "SALARY", 0.0));
  		Wlog("跳到末记录");
  		TsqlQueryEnd (parse);
  		Wlog("记录末尾 NAME = %s", TsqlQueryGetString(parse, "NAME", ""));
  		Wlog("记录末尾 SALARY = %f", TsqlQueryGetFloat(parse, "SALARY", 0.0));
  		Wlog("记录末尾 ID = %ld", TsqlQueryGetNumber(parse, "ID", 0));
  		Wlog("记录末尾(默认空) NAME = %s", TsqlQueryGetString(parse, "name", "morenzhi"));
  		Wlog ("遍历记录:\n");
  		TsqlQueryBegin (parse);
  		do {
  			Wlog ("id:%ld;name:%s;age:%ld;address:%s;salary:%f", 
  			TsqlQueryGetNumber(parse, "ID", 0)
  			,TsqlQueryGetString(parse, "NAME", "(null)")
  			,TsqlQueryGetNumber(parse, "AGE", 0)
  			,TsqlQueryGetString(parse, "ADDRESS", "(null)")
  			,TsqlQueryGetFloat(parse, "SALARY", 0.0)
  			);
  		} while (TsqlQueryNext (parse) > 0);
  		printf ("\n");
  		TsqlQueryDestroy(parse);
  	}
  	// Wlog("表 "TABLE_NAME" %s!", TsqlCtrlCheckTable(This, TABLE_NAME) == WSQLITE_TRUE ? "存在" : "不存在");
  	// TsqlCtrlDelTable(This, TABLE_NAME);
  	// Wlog("表 "TABLE_NAME" %s!", TsqlCtrlCheckTable(This, TABLE_NAME) == WSQLITE_TRUE?"存在":"不存在");
  	// Wlog("销毁");
  	TsqlCtrlDestroy(This);
  }
}

这些都为最基本的创建表、插入记录、删除记录、查询记录等操作。
开头先创建数据库操作句柄(实质上是类指针);
下面是相关头文件

/***c++头文件***/
#ifndef __W_SQL_SQLITE_HPP
#define __W_SQL_SQLITE_HPP
#include <sqlite/sqlite3.h>
#include <sqlite/WsqlQuery.hpp>
#include <sqlite/WsqlBlob.hpp>
#include <sqlite/WsqlCmd.h>
#include <mutex>
/***********************************************************
* 功    能:
*		查询结果回调函数。
*
* 参    数
* pdata:用户传入参数指针
* argc:成员数
* argv:查询结果对应成员值指针地址
* azColName:查询结果对应成员名指针地址
*
* 返 回 值
* 0:继续查找
* 非0:终止查找(sqlite3_exec返回SQLITE_ABORT错误)
***********************************************************/
#ifndef WsqlCallBack
typedef int WsqlCallBack(void* pdata, int argc, char** argv, char** azColName);
#endif

/***********************************************************
* 功   能:事务回调函数。调用事务处理时传入的回调函数
* 
* 注   意:		在事务的回调函数中必须使用未加锁的数据库操作函数!
*			否则会产生死锁!
* 
* 参   数:调用事务处理时传入的指针
* 
* 返 回 值
* TRUE:提交事务,执行COMMIT/END TRANSACTION
* FALSE:回滚事务,执行ROLLBACK
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
#ifndef WsqlTransactionCallBack
typedef TBool WsqlTransactionCallBack(void* pdata);
#endif
#endif
namespace sql {
  typedef enum {
  	True,//成功
  	False,//失败
  } Ret;
  class sqlite {
  	public:
  		/***********************************************************
  		* 功    能:
  		*		数据库操作构造函数
  		*
  		* 参    数
  		* filename:打开的数据库文件名
  		*
  		* 返 回 值
  		* 		无
  		***********************************************************/
  		sqlite (const char* const filename);
  		/***********************************************************
  		* 功    能:
  		*		数据库操作析构函数
  		*
  		* 参    数
  		*		无
  		*
  		* 返 回 值
  		* 		无
  		***********************************************************/
  		~sqlite ();
  	private:
  		sqlite3*		db = nullptr;

  		std::mutex		mtx;
  		/***********************************************************
  		* 功    能:
  		*		打开数据库。
  		*
  		* 参    数
  		* filename:数据库文件名
  		*
  		* 返 回 值
  		* TRUE:成功
  		* FALSE:失败
  		***********************************************************/
  		TBool Open (const char* const filename);
  		/***********************************************************
  		* 功    能:
  		*		关闭数据库。
  		*
  		* 参    数
  		* 		无
  		*
  		* 返 回 值
  		* 		无
  		***********************************************************/
  		void Close (void);
  	public:
  		/***********************************************************
  		* 功    能:
  		*		未加锁的数据库语句执行函数。
  		*
  		* 参    数
  		* sql:数据库完整语句
  		* func:数据库回调函数,可为NULL
  		* param:回调函数入口参数,可为NULL
  		*
  		* 返 回 值
  		* 	参考enum Ret
  		***********************************************************/
  		#ifdef WSQLITE_ENABLE_NOMUTEX
  		Ret ExecNoMutex (const char* const sql, WsqlCallBack func, void* param);
  		#endif
  		/***********************************************************
  		* 功    能:
  		*		数据库语句执行函数
  		*
  		* 参    数
  		* sql:数据库完整语句
  		* func:数据库回调函数,可为NULL
  		* param:回调函数入口参数,可为NULL
  		*
  		* 返 回 值
  		* 	参考enum Ret
  		***********************************************************/
  		Ret Exec (const char* const sql, WsqlCallBack func, void* param);
  		/***********************************************************
  		* 功    能:
  		*		事务处理。
  		*
  		* 参    数
  		* func:事务回调函数,不可为NULL
  		* param:回调函数入口参数,可为NULL
  		*
  		* 返 回 值
  		* 	无
  		***********************************************************/
  		#ifdef WSQLITE_ENABLE_NOMUTEX
  		TBool Transaction (WsqlTransactionCallBack func, void* param);
  		#endif
  		/***********************************************************
  		* 功    能:(未加锁)
  		*		查询记录数:此接口做了限制
  		* 	查询语句模板:SELECT COUNT(*) AS Cnt FROM table_name WHERE rowid<10
  		* 必须有AS Cnt 因为查询时通过搜索Cnt字段读取结果,
  		*
  		* 参    数
  		* SqlCmd:查询语句
  		*
  		* 返 回 值
  		* 	查询结果。
  		***********************************************************/
  		#ifdef WSQLITE_ENABLE_NOMUTEX
  		TUint32 RecordCntNoMutex (const char* const SqlCmd);
  		#endif
  		/***********************************************************
  		* 功    能:
  		*		查询记录数:此接口做了限制
  		* 	查询语句模板:SELECT COUNT(*) AS Cnt FROM table_name WHERE rowid<10
  		* 必须有AS Cnt 因为查询时通过搜索Cnt字段读取结果,
  		*
  		* 参    数
  		* SqlCmd:查询语句
  		*
  		* 返 回 值
  		* 	查询结果。
  		***********************************************************/
  		TUint32 RecordCnt (const char* const SqlCmd);
  		/***********************************************************
  		* 功    能:
  		*		检查字段名是否存在。
  		*
  		* 参    数
  		* table_anme:表名
  		* Filed_name:字段名
  		*
  		* 返 回 值
  		* TRUE:存在
  		* FALSE:不存在
  		***********************************************************/
  		TBool CheckField (const char* const table_anme, const char* const Filed_name);
  		/***********************************************************
  		* 功    能:
  		*		查询表(未加锁)
  		*
  		* 参    数
  		* sql:查询语句
  		*
  		* 返 回 值
  		* 成功:返回查询结果类指针
  		* 失败:NULL
  		***********************************************************/
  		#ifdef WSQLITE_ENABLE_NOMUTEX
  		class Query* QueryNoMutex(const char* const sql);
  		#endif
  		/***********************************************************
  		* 功    能:
  		*		查询表
  		*
  		* 参    数
  		* sql:查询语句
  		*
  		* 返 回 值
  		* 成功:返回查询结果类指针
  		* 失败:NULL
  		***********************************************************/
  		class Query* Query(const char* const sql);
  		/***********************************************************
  		* 功    能:
  		*		写blob数据(未加锁)
  		*
  		* 参    数
  		* sqlCmd:sql命令
  		* data:传入存储容器以及须获取的列号
  		*
  		* 返 回 值
  		* 	参考enum Ret
  		***********************************************************/
  		#ifdef WSQLITE_ENABLE_NOMUTEX
  		Ret WriteBlobNoMutex (const char* const  sqlCmd, class blob* data);
  		#endif
  		/***********************************************************
  		* 功    能:
  		*		写blob数据
  		*
  		* 参    数
  		* sqlCmd:sql命令
  		* data:传入存储容器以及须获取的列号
  		*
  		* 返 回 值
  		* 	参考enum Ret
  		***********************************************************/
  		Ret WriteBlob (const char* const  sqlCmd, class blob* data);
  		/***********************************************************
  		* 功    能:
  		*		读blob数据
  		*	注意:此接口返回为NULL时即已销毁传入的data
  		*
  		* 参    数
  		* sqlCmd:sql命令
  		* data:传入存储容器以及须获取的列号
  		*
  		* 返 回 值
  		* 	返回读出的数据。
  		***********************************************************/
  		class blob* ReadBlob (const char* const  sqlCmd, class blob* data);
  };
}
#endif
/***c接口头文件***/
#ifndef __WSQLITE_H
#define __WSQLITE_H
#include <Tdatatype.h>
#include <sqlite/WsqlQuery.h>
#include <sqlite/WsqlBlob.h>
#include <sqlite/WsqlCmd.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
	WSQLITE_TRUE,//成功
	WSQLITE_FALSE,//失败
} TsqlRet;
struct TsqlCtrl;
/***********************************************************
* 功    能:
*		查询结果回调函数。
*
* 参    数
* pdata:用户传入参数指针
* argc:成员数
* argv:查询结果对应成员值指针地址
* azColName:查询结果对应成员名指针地址
*
* 返 回 值
* 0:继续查找
* 非0:终止查找(sqlite3_exec返回SQLITE_ABORT错误)
***********************************************************/
#ifndef WsqlCallBack
typedef int WsqlCallBack(void* pdata, int argc, char** argv, char** azColName);
#endif
/***********************************************************
* 功   能:事务回调函数。调用事务处理时传入的回调函数
* 
* 注   意:		在事务的回调函数中必须使用未加锁的数据库操作函数!
*			否则会产生死锁!
* 
* 参   数:调用事务处理时传入的指针
* 
* 返 回 值
* TRUE:提交事务,执行COMMIT/END TRANSACTION
* FALSE:回滚事务,执行ROLLBACK
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
#ifndef WsqlTransactionCallBack
typedef TBool WsqlTransactionCallBack(void* pdata);
#endif
#endif
/***********************************************************
* 功    能:
*		数据库语句执行函数(未加锁)
*
* 参    数
* sqlCmd:数据库完整语句
* func:数据库回调函数,可为NULL
* param:回调函数入口参数,可为NULL
*
* 返 回 值
* 	参考TsqlRet
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
TsqlRet TsqlCtrlExecNoMutex (struct TsqlCtrl* This, const char* const sqlCmd, WsqlCallBack func, void* param);
#endif
/***********************************************************
* 功    能:
*		数据库语句执行函数
*
* 参    数
* sqlCmd:数据库完整语句
* func:数据库回调函数,可为NULL
* param:回调函数入口参数,可为NULL
*
* 返 回 值
* 	参考TsqlRet
***********************************************************/
TsqlRet TsqlCtrlExec (struct TsqlCtrl* This, const char* const sqlCmd, WsqlCallBack func, void* param);
/***********************************************************
* 功    能:
*		事务处理。
*
* 参    数
* func:事务回调函数,不可为NULL
* param:回调函数入口参数,可为NULL
*
* 返 回 值
* 	无
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
TBool TsqlCtrlTransaction (struct TsqlCtrl* This, WsqlTransactionCallBack func, void* param);
#endif
/***********************************************************
* 功    能(未加锁)
*		查询记录数:此接口做了限制
* 	查询语句模板:SELECT COUNT(*) AS Cnt FROM table_name WHERE rowid<10
* 必须有AS Cnt 因为查询时通过搜索Cnt字段读取结果,
*
* 参    数
* SqlCmd:查询语句
*
* 返 回 值
* 	查询结果。
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
TUint32 TsqlCtrlRecordCntNoMutex (struct TsqlCtrl* This, const char* const SqlCmd);
#endif
/***********************************************************
* 功    能
*		查询记录数:此接口做了限制
* 	查询语句模板:SELECT COUNT(*) AS Cnt FROM table_name WHERE rowid<10
* 必须有AS Cnt 因为查询时通过搜索Cnt字段读取结果,
*
* 参    数
* SqlCmd:查询语句
*
* 返 回 值
* 	查询结果。
***********************************************************/
TUint32 TsqlCtrlRecordCnt (struct TsqlCtrl* This, const char* const SqlCmd);
/***********************************************************
* 功    能
*		检查字段名是否存在。
*
* 参    数
* table_anme:表名
* Filed_name:字段名
*
* 返 回 值
* TRUE:存在
* FALSE:不存在
***********************************************************/
TBool TsqlCtrlCheckField (struct TsqlCtrl* This, const char* const table_anme, const char* const Filed_name);
/***********************************************************
* 功    能:
*		查询表(未加锁)
*
* 参    数
* sql:查询语句
*
* 返 回 值
* 成功:返回查询结果类指针
* 失败:NULL
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
struct TsqlQuery* TsqlCtrlQueryNoMutex(struct TsqlCtrl* This, const char* const sql);
#endif
/***********************************************************
* 功    能:
*		查询表
*
* 参    数
* sql:查询语句
*
* 返 回 值
* 成功:返回查询结果类指针
* 失败:NULL
***********************************************************/
struct TsqlQuery* TsqlCtrlQuery(struct TsqlCtrl* This, const char* const sql);
/***********************************************************
* 功    能:
*		写blob数据(未加锁)
*
* 参    数
* sqlCmd:sql命令
* data:写入数据
*
* 返 回 值
* WSQLITE_TRUE:写入成功
* 其他:参考TsqlRet
***********************************************************/
#ifdef WSQLITE_ENABLE_NOMUTEX
TsqlRet TsqlCtrlWriteBlobNoMutex (struct TsqlCtrl* This, const char* const  sqlCmd, struct TsqlBlob* data);
#endif
/***********************************************************
* 功    能:
*		写blob数据
*
* 参    数
* sqlCmd:sql命令
* data:写入数据
*
* 返 回 值
* WSQLITE_TRUE:写入成功
* 其他:参考TsqlRet
***********************************************************/
TsqlRet TsqlCtrlWriteBlob (struct TsqlCtrl* This, const char* const  sqlCmd, struct TsqlBlob* data);
/***********************************************************
* 功    能:
*		读取blob数据
*	注意:此接口返回为NULL时即已销毁传入的data
*
* 参    数
* sqlCmd:sql命令
* data:传入存储容器以及须获取的列号
*
* 返 回 值
* 成功:返回查询结果类指针
* 失败:NULL
***********************************************************/
struct TsqlBlob* TsqlCtrlReadBlob (struct TsqlCtrl* This, const char* const  sqlCmd, struct TsqlBlob* data);
/***********************************************************
* 功    能:
*		注销数据库控制类
*
* 参    数
*
* 返 回 值
***********************************************************/
void TsqlCtrlDestroy (struct TsqlCtrl* This);
//#define TsqlCtrlDestroy(PCLASS_ADDR)		free (PCLASS_ADDR)
/***********************************************************
* 功    能:
*		创建数据库控制类
*
* 参    数
* pfilename:打开的数据库文件名
*
* 返 回 值
* 成功:返回类指针
* 失败:NULL
***********************************************************/
struct TsqlCtrl* CreateSqlCtrl (const char* pfilename);
#ifdef __cplusplus
}
#endif
#endif

测试案例中database.db为打开或创建的数据库文件名,打开或创建成功将返回打开的数据库句柄,失败则返回NULL。
函数TsqlCtrlExec为数据库语句执行函数,对原始API未做多余操作,最主要的是添加了线程锁,而传入的数据库语句中SQLCMD_DROP_TABLE(TABLE_NAME)为删除数据库中的表;其原型为见下文头文件。SQLCMD_CREATE_TABLE()宏则为创建表的语句(使用宏纯属懒人使用,只为少敲几行代码。宏可以留下一遍日后某些不常用用法忘记了可以回头看看宏定义)。
下面是一些常用命令的宏定义:

#ifndef __WSQLCMD_H
#define __WSQLCMD_H
// 开关宏
#define WSQLITE_ENABLE_NOMUTEX
//SQL 语句
//创建表
#define SQLCMD_CREATE_TABLE(TABLE_NAME,MEMBER)		"CREATE TABLE IF NOT EXISTS " TABLE_NAME " (" MEMBER ");" 
//删除表
//#define	SQLCMD_DROP_TABLE(TABLE_NAME)		"DROP IF EXISTS TABLE " TABLE_NAME ";" 
#define	SQLCMD_DROP_TABLE(TABLE_NAME)		"DROP TABLE " TABLE_NAME ";" 
//检查表是否存在
#define SQLCMD_CHECK_TABLE(TABLE_NAME)		"SELECT COUNT(*) AS Cnt FROM sqlite_master where type='table' and name='" TABLE_NAME "';" 
//查询记录数
#define SQLCMD_RECORDCNT(TABLE_NAME) "SELECT COUNT(*) AS Cnt FROM " TABLE_NAME 
#define SQLCMD_RECORDCNTEX(TABLE_NAME,DONDITION) "SELECT COUNT(*) AS Cnt FROM " TABLE_NAME " WHERE " DONDITION 
//将表中的rowid自增序列归零,下一次插入记录的行号从当前设置的0+1开始,注意:seq的值不能小于当前最大的rowid
#define	SQLCMD_CLEAR_TABLE_ROWID(TABLE_NAME)		"UPDATE sqlite_sequence SET seq=0 WHERE name='" TABLE_NAME "';" 
//查询表字段等信息
/***************
 * 判断 pk 列是否为1,name即为主键列名
***************/
#define SQLCMD_TABLEINFO(TABLE_NAME)	"PRAGMA table_info(" TABLE_NAME ");" 
//重命名表
#define SQLCMD_RENAME_TABLE(OLD_NAME,NEW_NAME)	"ALTER TABLE " OLD_NAME " RENAME TO " NEW_NAME 
// 增加表中字段
#define SQLCMD_ADD_COLUMN(TABLE_NAME,TABLE_FIELD)	"ALTER TABLE " TABLE_NAME " ADD COLUMN " TABLE_FIELD 
// 创建索引
#define SQLCMD_CREATE_IDX(TABLE_NAME,IDX_NAME,IDX_PARAM)	"CREATE INDEX IF NOT EXISTS " IDX_NAME " ON " TABLE_NAME " (" IDX_PARAM ") ;" 
//#define SQLCMD_CREATE_IDX(TABLE_NAME,IDX_NAME,IDX_PARAM)	"CREATE INDEX " IDX_NAME " ON " TABLE_NAME " (" IDX_PARAM ") ;" 
// 查询索引是否存在
#define SQLCMD_IDX_EXIST(IDX_NAME)	"SELECT COUNT(*) AS Cnt FROM sqlite_master WHERE type='index' AND name='" IDX_NAME "'" 
// 删除索引
#define SQLCMD_DROP_IDX(IDX_NAME)	"DROP INDEX " IDX_NAME 
#endif

有时我们更新升级软件时,可能需要为已有的表添加某个字段,此时我们就需要检测某个字段是否已存在。此数据库类封装了字段检查函数TsqlCtrlCheckField,传入表名及字段名即可返回是否存在。
创建好数据库和表之后,插入一系列记录,最常用的查询则使用TsqlCtrlQuery函数进行,查询结构通过返回值返回数据库查询结果句柄。查询失败或未查询到记录则返回NULL,如例程中所示。
测试代码运行结果如下:

创建表 
字段AGE:存在 
字段AAAAAA:不存在 
创建索引! 
ID = 1
NAME = 张三
AGE = 18
ADDRESS = 珠海
SALARY = 2500.0

ID = 2
NAME = 李四
AGE = 21
ADDRESS = 广州
SALARY = 6080.0

ID = 3
NAME = 啊五
AGE = 30
ADDRESS = 深圳
SALARY = 10800.0

record=4 
AGE = 18
NAME = 张三

AGE = 21
NAME = 李四

AGE = 31
NAME = 啊五

AGE = 10
NAME = 小哀 = 31
ADDRESS = 深圳
SALARY = 10800.0

ID = 5
NAME = 小刘
AGE = 28
ADDRESS = 梅州
SALARY = 8500.32

ID = 6
NAME = 小张
AGE = 29
ADDRESS = 深圳
SALARY = 7500.25

ID = 7
NAME = 小雪
AGE = 40
ADDRESS = 广州
SALARY = 10080.46

ID = 2
NAME = 李四
AGE = 21
ADDRESS = 广州
SALARY = 6080.0

ID = 3
NAME = 啊五
AGE = 31
ADDRESS = 深圳
SALARY = 10800.0

ID = 5
NAME = 小刘
AGE = 28
ADDRESS = 梅州
SALARY = 8500.32

ID = 6
NAME = 小张
AGE = 29
ADDRESS = 深圳
SALARY = 7500.25

ID = 7
NAME = 小雪
AGE = 40
ADDRESS = 广州
SALARY = 10080.46

ID = 8
NAME = 小吴
AGE = 23
ADDRESS = 上海
SALARY = 9600.0

ID = 9
NAME = 阿奇
AGE = 35
ADDRESS = 北京
SALARY = 8500.21

ID = 10
NAME = 志勇
AGE = 29
ADDRESS = 长沙
SALARY = 6800.69

跳转到记录2! 
记录2 NAME = 小刘 
下一条记录:4 
记录3 NAME = 小张 
记录3 SALARY = 7500.250000 
上一条记录:3 
记录2 NAME = 小刘 
记录2 SALARY = 8500.320000 
跳到首记录 
记录0 NAME = 李四 
记录0 SALARY = 6080.000000 
跳到末记录 
记录末尾 NAME = 志勇 
记录末尾 SALARY = 6800.690000 
记录末尾 ID = 10 
记录末尾(默认空) NAME = 志勇 
遍历记录:
 
id:2;name:李四;age:21;address:广州;salary:6080.000000 
id:3;name:啊五;age:31;address:深圳;salary:10800.000000 
id:5;name:小刘;age:28;address:梅州;salary:8500.320000 
id:6;name:小张;age:29;address:深圳;salary:7500.250000 
id:7;name:小雪;age:40;address:广州;salary:10080.460000 
id:8;name:小吴;age:23;address:上海;salary:9600.000000 
id:9;name:阿奇;age:35;address:北京;salary:8500.210000 
id:10;name:志勇;age:29;address:长沙;salary:6800.690000
头文件及源代码中含有大量注释,这里就不做多余说明了~
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Android中的SQLite数据库是一种轻量级的数据库,它可以在Android应用程序中存储和检索数据。SQLite数据库使用SQL语言来管理数据,可以在Android应用程序中创建、读取、更新和删除数据。使用SQLite数据库可以使应用程序更加高效和可靠,因为它可以在本地存储数据,而不需要访问网络。在Android中使用SQLite数据库需要使用SQLiteOpenHelper来创建和管理数据库SQLiteOpenHelper提供了一些方法来创建和升级数据库,以及插入、查询、更新和删除数据。在使用SQLite数据库时,需要注意数据型、表结构、SQL语句等方面的问题,以确保数据的正确性和完整性。 ### 回答2: Android平台经常使用SQLite数据库来存储和管理本地数据。在本文中,我们将讨论如何在Android中使用SQLite数据库。 首先,在Android中使用SQLite数据库,我们需要创建一个SQLiteOpenHelper。这个用于创建和升级数据库。它包含了两个重要的方法:onCreate()和onUpgrade()。onCreate()方法将在首次创建数据库时被调用。onUpgrade()方法将在升级数据库时被调用。我们可以在这个中定义表名,列名,数据库版本号和其他数据库相关信息。 接下来,在我们使用数据库前,需要实例化一个SQLiteOpenHelper对象。这个对象用于打开或创建数据库。我们可以使用getReadableDatabase()和getWritableDatabase()方法来获取一个可读/写的数据库对象。 在获取数据库对象后,我们可以执行SQL命令来操作数据库。我们可以使用execSQL()方法来执行SQL命令。我们可以使用insert()、update()和delete()方法来执行增、删、改操作。我们可以使用rawQuery()方法来执行查询操作SQLiteOpenHelperSQLiteDatabase并不是线程安全的。因此我们需要确保在使用时进行同步操作。我们可以使用synchronized关键字来达到同步效果。 在Android中,许多第三方的开源框架,如OrmLite、GreenDao和Realm等,提供了ORM(对象关系映射)的功能,使得数据库操作更加简单和便捷。 总的来说,在Android中使用SQLite数据库可以轻松地存储和管理本地数据。SQLiteOpenHelper和SQLiteDatabase提供了丰富的API来操作数据库。ORM框架为我们提供了更加简便的数据库操作方式。因此,掌握Android中SQLite数据库使用非常重要。 ### 回答3: Android SQLite数据库是Android开发中最常用的数据库之一,它是一个基于文件的嵌入式关系数据库管理系统。SQLite在设计时考虑到了资源占用和运行效率,所以非常适合在移动设备上使用。下面将详细介绍如何使用Android SQLite数据库。 1. 创建数据库 首先需要创建一个SQLite数据库,通过SQLiteOpenHelper来创建,传入的参数主要是数据库版本号和数据库名称。在SQLiteOpenHelper的子中重写onCreate方法来创建表格和一些初始化操作。 2. 执行SQL语句 在SQLiteOpenHelper的子中重写onUpgrade方法来执行升级操作,可以通过执行ALTER TABLE语句来修改表格结构,并通过DROP TABLE语句删除表格。除此之外,在应用中也可以通过SQLiteDataBase对象的execSQL方法来执行SQL语句,如插入、删除或修改数据等。 3. 增删改查操作 增加(insert):通过SQLiteDataBase对象的insert方法来实现,在方法中传入表名和map对象,map对象中存储数据的键值对。 删除(delete):同样通过SQLiteDataBase对象的delete方法来实现,传入表名和删除条件。 修改(update):也是通过SQLiteDataBase对象的update方法来实现,同时传入修改的数据及条件。 查询(query):同样通过SQLiteDataBase对象的query方法来实现,传入要查询的表名、查询的列、查询条件等参数即可。 4. 事务操作 SQlite数据库支持事务操作,可以在一组操作中,只要有一个操作出现问题,就可以将之前的操作全部回滚,以保证数据的完整性和一致性。 以上就是android-sqlite数据库使用方法,当然还有很多细节需要注意,例如:表格的设计、SQL语句的优化等。熟练掌握SQLite使用,可以帮助开发者更好地管理应用数据,提高应用性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pioneer_t

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值