sqlite3如何获取数据库数据中的第一条数据及其id号

当我在开发一个项目时,发现当数据库中存入了较多的信息时,我们要读每条数据然后处理删除时,我会用select 语句来逐一读取,但这样有个弊端就是我需要自己来维护这个id值,这样就是得代码变得更加复杂,可重入性大大降低。但是sqlite3还是给我们提供了很多便利,我们可以通过只读取第一条数据方法来让数据库自己来维护这个id值,这样就是得了我们的代码精简了很多,而且代码的可重入性也有了比较乐观的改善。

话不多说上函数:

#include "init_db.h"

/* 创建数据库 */
sqlite3 * sqlite_create();

/*  将数据写入数据库 */
int   write_db(sqlite3 *db, tlv_buf_t *tlv);

/*  从数据库中删除已经发送成功的数据 */
int   rm_tlvda_db(sqlite3 *db, int db_id);

/*  从数据库中读取数据 */
unsigned short read_db_data(sqlite3* db,s_db_data* s_data);

/*  数据库的callback函数 */
inline int   callback(void* para, int f_num, char ** f_value,char** f_name);

sqlite3 * sqlite_create()
{
    sqlite3*  db = NULL;
    const char*       sql_create = "create table if not exists temp(id integer PRIMARY KEY autoincrement,tlv_data blob)";
    if (access(DB_PATHNAME, F_OK) != 0)  //判断数据库文件是否存在
    {
        if (sqlite3_open(DB_PATHNAME, &db) != SQLITE_OK)
        {
            printf("Open sqlite error:%s\n", sqlite3_errmsg(db));
            return ;
        }
        else 
        {
            printf("Open sqlite success.\n");
        } 
        if (sqlite3_exec(db, sql_create, NULL, NULL, NULL)!= SQLITE_OK)
        {
            printf("Create table error:%s\n", sqlite3_errmsg(db));
            return ;
        }
    }
    if (sqlite3_open(DB_PATHNAME, &db) != SQLITE_OK) //数据库文件存在则直接打开数据库文件
    {
        printf("Open sqlite error:%s\n", sqlite3_errmsg(db));
        return ;
    }

    if (sqlite3_exec(db, sql_create, NULL, NULL, NULL)!= SQLITE_OK)	                 
    { 
        printf("Create table error:%s\n", sqlite3_errmsg(db));
        return ;
    }   
    return db;
}

int  write_into_db(sqlite3 *db, tlv_buf_t *tlv)
{
    char             sql_insert[64] = {0};
    sqlite3_stmt  *stmt = NULL;

    memset(sql_insert, 0, 64);
    snprintf(sql_insert, 64, "insert into temp values(null,?);");

    sqlite3_prepare(db, sql_insert, strlen(sql_insert),&stmt,0);
    {
        sqlite3_bind_blob(stmt, 1, &tlv->buf, tlv->len,NULL);
        sqlite3_step(stmt);
    }

    sqlite3_finalize(stmt);

    return 0;
}

unsigned short read_db_data(sqlite3* db,s_db_data* s_data)
{

    char sql_select[64]  = "select tlv_data from temp limit 1";
    char sql_id[64]  = "select * from temp limit 1";
    unsigned short first_id = -1;  //需要获取的id变量
    sqlite3_stmt      *pstmt = 0;

    if (sqlite3_exec(db, sql_select, callback, s_data, NULL)!= SQLITE_OK)
    {
        printf("select data from db error.\n");
        return -1;
    }

    if( (sqlite3_prepare(db, sql_id, strlen(sql_id), &pstmt, NULL)) != SQLITE_OK )
    {
        printf("sqlite3_prepare error ! \n");
        return -1;
    }

    sqlite3_step(pstmt);

    /*  读取整形数据 第一个数据的ID */
    first_id = sqlite3_column_int(pstmt,0);

    sqlite3_finalize(pstmt);
    return first_id;
}

/* 回调函数 */
int callback(void* para, int f_num, char ** f_value,char** f_name)
{
    s_db_data * db_da = (s_db_data* )para;
    memset(db_da->buf, 0, db_da->len);
    memcpy(&db_da->buf, *f_value, db_da->len);
    return 0;
}

/*  从数据库中删除已经发送成功的数据 */
int rm_tlvda_db(sqlite3 *db, int db_id)
{

    char sql[64] = {0};
    snprintf(sql,64,"delete from temp where id = %d",db_id);
    if (sqlite3_exec(db, sql,NULL, NULL, NULL)!= SQLITE_OK)
    {

        printf("rm db da error.\n");
    }
}

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要调用数据库的上一个数据,您需要先确定以下内容: 1. 数据库的类型和结构,例如MySQL,SQLite,PostgreSQL等。 2. 数据库存储数据的表结构,例如表格名称,字段名称和数据类型。 3. 数据库存储的数据的排序方式,例如按照时间戳或ID号排序。 在此基础上,您可以使用Arduino连接到数据库并执行SQL查询来获取上一个数据。以下是一个示例代码: #include <SPI.h> #include <Ethernet.h> #include <MySQL_Connection.h> #include <MySQL_Cursor.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress server_addr(192,168,1,100); char user[] = "username"; char password[] = "password"; char query[] = "SELECT * FROM measurements ORDER BY timestamp DESC LIMIT 1,1"; EthernetClient client; MySQL_Connection conn((Client *)&client); void setup() { Serial.begin(9600); Ethernet.begin(mac); if (conn.connect(server_addr, 3306, user, password)) { Serial.println("Connected successfully"); } else { Serial.println("Connection failed"); } } void loop() { MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); cur_mem->execute(query); MySQL_Row row = cur_mem->getRowAt(0); Serial.print("Previous measurement: "); Serial.println(row.getString(1)); delete cur_mem; delay(5000); } 该示例代码假设您的数据库表名称为“measurements”,包含一个名为“timestamp”的时间戳字段和一个名为“data”的数据字段。它使用“ORDER BY”和“LIMIT”子句来按时间戳倒序排列数据,并获取第二行(即上一个数据)。您可以根据实际情况修改查询语句。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XiaoCheng'Blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值