博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓NDK操作sqlite3
阅读量:5233 次
发布时间:2019-06-14

本文共 2689 字,大约阅读时间需要 8 分钟。

  最近在给公司开发NDK相关的东西,需要持久化的存储一些数据。

  刚开始是想用文件来存储的,后来发现文件不方便检索,就想到了使用sqlite。

  sqlite操作起来比较简单,可是在NDK下面开发就没有经验了。

  

  百度之后发现,可以使用静态库和动态库两种方法来加载sqlite库,进行sqlite的操作。

  两种方法的优缺点如下:

  1. 静态库就是把库文件编译到代码中,这样编译出的文件相比于动态库要大点,但是操作比较简单。

  2. 动态库就是在程序运行的时候加载需要的库文件,这样编译出来的文件比较小,也可以方便库的复用。但是前期配置比较复杂。

 

  百度出来的大部分都是动态库的方式,可能是我水平不行,试了半天一直不成功。后来在stackoverflow()上发现一个静态库的方式,使用起来比较简单,下面简单介绍一下。

  一、 静态库方式

  

  1. 上官网下载sqlite3源码

  

  2. 将sqlite3.c 和 sqlite3.h 拷贝到jni文件夹中

  

  3. Android.mk文件中LOCAL_SRC_FILES 加上 sqlite3.c

  

 

  4. 代码中使用的时候#include "sqlite3.h" 即可。

  

  代码如下:

  sqliteTest.c

#include
#include
#include "mydebug.h"#include "sqlite3.h"static int callback(void *NotUsed, int argc, char **argv, char **azColName) { int i; for (i = 0; i < argc; ++i) { LOGE("mydebug", "%s = %s,", azColName[i], argv[i] ? argv[i] : "NULL"); } LOGE("mydebug", "\n"); return 0;}int sqlite_test(char *database_name){ sqlite3 *db; char *sql, *errMsg; int rv; rv = sqlite3_open(database_name, &db); if(rv) { LOGE("mydebug","sqlite open error %s\r\n", sqlite3_errmsg(db)); sqlite3_close(db); } sql = "CREATE TABLE IF NOT EXISTS parameter (" "id INTEGER PRIMARY KEY NOT NULL," "name TEXT NOT NULL" ");"; rv = sqlite3_exec(db, sql, callback, 0, &errMsg); if(rv != SQLITE_OK) { LOGE("mydebug", "sqlite exec error %s, sql = %s\r\n", errMsg, sql); return -1; } else { LOGE("mydebug", "sqlite create table success"); } sql = "INSERT INTO parameter (id, name) VALUES " "(4, 'end')"; rv = sqlite3_exec(db, sql, callback, 0, &errMsg); LOGE("mydebug", "insert into rv = %d", rv); if(rv != SQLITE_OK) { LOGE("mydebug", "sqlite exec error %s, sql = %s\r\n", errMsg, sql); return -1; } else { LOGE("mydebug", "sqlite insert into success"); } sql = "SELECT * FROM parameter "; rv = sqlite3_exec(db, sql, callback, 0, &errMsg); if(rv != SQLITE_OK) { LOGE("mydebug", "sqlite exec error %s, sql = %s\r\n", errMsg, sql); return -1; } else { LOGE("mydebug", "sqlite select success"); return 0; } sqlite3_close(db); return 0;}

  调用:

JNIEXPORT jstring JNICALL Java_com_example_q6jnitest_Jni_SqliteTest(JNIEnv * env,jclass obj){    LOGE("mydebug", "start\r\n");    char database_name[] = "/sdcard/test.db";    sqlite_test((char *)database_name);    return env->NewStringUTF("sqlite success");}

 

  

   程序运行之后就可以在/sdcard文件夹下找到数据库文件,可以用adb.exe将数据库文件拷贝到电脑上来查看。

adb pull /sdcard/test.db C:\Users\administere\Desktop

  

 

转载于:https://www.cnblogs.com/guansixu/p/6756638.html

你可能感兴趣的文章
java io 模型重点讲述
查看>>
Linux基础命令
查看>>
C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe...
查看>>
Keywords Search
查看>>
js操作高级
查看>>
L1-039 古风排版
查看>>
自定义鼠标光标,制作cur,设置热点,中心点。
查看>>
《基于Node.js实现简易聊天室系列之引言》
查看>>
05-树7 堆中的路径 (25 分)
查看>>
正则表达式 我遇到的
查看>>
[bzoj1798][Ahoi2009]Seq 维护序列seq
查看>>
安全扫描工具 AppScan
查看>>
[luogu3237 HNOI2014] 米特运输 (树形dp)
查看>>
再见,2014;您好,2015!
查看>>
Single Number
查看>>
DOM详解
查看>>
Python 变量类型 —— type() 函数和 isinstance() 函数
查看>>
设置MAVEN_OPTS环境变量
查看>>
Open quote is expected for attribute "{1}" associated with an element type "column".
查看>>
lintcode :Coins in Line II 硬币排成线 II
查看>>