android NDK中sqlite3数据库的使用

工作需要使用数据库进行大量的插入工作,故此想通过使用c进行这部分工作,经过查资料,发现一篇文章比较实用:
 方法1.使用源码sqlite3.h,sqlite3.c进行编译。
 
 方法2.使用android编译好得到得libsqlite.so库
    具体方法:
    1) 使用adb命令 adb pull /system/lib/libsqlite.so 得到libsqlite.so库(在当前用户的根目录下)。

2)把得到libsqlite.so拷贝到$NDK/platforms/android-3/arch-arm/usr/lib 目录下(建议拷贝到platforms所有子目录的相应位置)

3)把sqlite3.h头文件拷贝到$NDK/platforms/android-3/arch-arm/usr/include目录下(同上),头文件可再在此下载

4)在android.mk文件中加入语句 LOCAL_LDLIBS := -lsqlite (注意如果需要链接编译多个动态库时,在该语句后面接这加动态库如:LOCAL_LDLIBS := -lsqlite  -llog)

5)以下使用代码:
    #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
     #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
    extern "C" {
    JNIEXPORT
   
void JNICALL
Java_com_sinde_nativedb_NativeDBHelper_insertWithTableName(JNIEnv*
env,jobject obj,jstring dbPath,jstring          f ilePath,jstring
tableName);
   }
   JNIEXPORT
void JNICALL
Java_com_sinde_nativedb_NativeDBHelper_insertWithTableName(JNIEnv*
env,jobject obj,jstring dbPath,jstring filePath,jstring tableName){
    sqlite3 *db;
    char *pErrMsg = 0;
    char* dbP = jstringTostring(env,dbPath);
    char* fP = jstringTostring(env,filePath);
    char* tName = jstringTostring(env,tableName);
    int openState = sqlite3_open(dbP,&db);
    if(openState != SQLITE_OK){
        return;
    }
    FILE *f;
    if((f = fopen(fP,"r")) == NULL){
        return;
    }
    char line[4096];
    char sql[6134];
    char head[1024];
    memset(line,0,4096);
    memset(sql,0,6134);
    memset(head,0,1024);
    readLine(f,head);
    LOGW("line:%s",head);
    int size = 0;
    while(!feof(f)){
        readLine(f,line);
        sprintf(sql,"insert into %s (%s) values (%s)",tName,head,line);
        if(size==0){
            sqlite3_exec(db, "BEGIN;", 0, 0, &pErrMsg);
        }
//        LOGW("sql:%s",sql);
        sqlite3_exec(db,sql,0,0,&pErrMsg);
        if(size == 5000){
            size = 0;
            sqlite3_exec(db, "COMMIT;", 0, 0, &pErrMsg);
            LOGW("insert 5000");
        }else{
            size++;
        }
        memset(line,0,4096);
        memset(sql,0,6134);
        sqlite3_free(pErrMsg);
    }
    if(size != 0){
        sqlite3_exec(db, "COMMIT;", 0, 0, &pErrMsg);
        sqlite3_free(pErrMsg);
    }
    LOGW("insert over");
    fclose(f);
    sqlite3_close(db);
}
//读文件的一行
char* readLine(FILE* f,char* line){
    char* start = line;
    char temp;
    while(((temp = fgetc(f)) != ‘\n‘) && !feof(f)){
        *start++ = temp;
    }
    return line;
}
//jstring转char*
char* jstringTostring(JNIEnv* env, jstring jstr)
{
       char* rtn = NULL;
       jclass clsstring = env->FindClass("java/lang/String");
       jstring strencode = env->NewStringUTF("utf-8");
       jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
       jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
       jsize alen = env->GetArrayLength(barr);
       jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
       if (alen > 0)
       {
                 rtn = (char*)malloc(alen + 1);
                 memcpy(rtn, ba, alen);
                 rtn[alen] = 0;
       }
       env->ReleaseByteArrayElements(barr, ba, 0);
       return rtn;
}

时间: 2024-08-05 06:34:10

android NDK中sqlite3数据库的使用的相关文章

Android NDK中的C++调试踩坑标记

RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后改造下mk文件: #APP_DEBUG will be set by android-ndk if NDK_DEBUG=1 is set. ifdef APP_DEBUG ifeq ($(APP_DEBUG),true) CFLAGS+= -O0 -g LOCAL_CFLAGS+= -D_DEBUG

Android NDK中的Apache ANT和GUN Make

Android NDK是Android软件开发包SDK的相关工具集,用来扩展Android SDK的功能,从而使开发人员能够使用机器代码生成的编程语言(如C.c++和汇编语言)实现一些对代码性能要求较高的模块并将这些模块嵌入到Android应用程序中. Apache ANT是命令行构建工具,可以驱动任何根据目标和任务描述的过程. 安装命令 sudo apt-get install ant GNU Make是一种构建工具,用于控制应用源代码的可执行代码和其他部分代码的生成. 安装命令 sudo a

android ndk中的工具使用

1. 动态so处理: arm-linux-androideabi-readelf.exe -a XX.so > xx.txt 输出所有函数 arm-linux-androideabi-objdump.exe -dx XX.so > xx.txt 反汇编so包,此时使用 $(JNI_PROJ_PATH)/obj\local\armeabi下面带符号表的so包.JNI_PROJ_PATH为编译so包时jni文件夹的根目录 2. 静态a处理: arm-linux-androideabi-ar.exe

XamarinSQLite教程在Xamarin.Android项目中定位数据库文件

XamarinSQLite教程在Xamarin.Android项目中定位数据库文件 实际开发中,经常需要验证数据库操作的正确性.这个时候,需要打开数据库文件,进行确认.下面是如何找到MyDocuments.db文件的具体步骤: (1)在VS的工具栏中找到打开Android设备监视器 (DDMS)按钮,如图1.32所示 (2)单击Open Android Device Monitor (DDMS) 按钮,弹出Android Device Monitor界面,如图1.33所示. (3)选择File

android项目中,数据库复制问题

============问题描述============ 用java io流复制后的sqlite3数据库文件,中文数据查询不出来,诸位是否遇到过这种问题,帮我解答一下 ============解决方案1============ private void dbImport()     {         try         {             File dir = new File(DATABASE_PATH);             // 如果/sdcard/testdb目录中存在

android开发中的数据库SQLite的使用

其实学习android很久了,关于数据存储,之前学习的时候也一同学习过,编程这些东西很久没用都忘得差不多了,最近做个项目要用到,所以又学习了一遍. android中关于数据的存储有好几种,这次主要是SQLite的使用. 首先说一点,我的技术很烂,原理什么的不说了,就是讲一下怎么使用,包括“增删改查”这几个操作. 使用数据库的前提是有数据库,有表,所以我们首先是要有一个数据库,然后还得建一张表(至少一张表).sql语句就是“create table XXX()”.作为一个数据库系统,SQLite也

Android开发中使用数据库时出现java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.

最近在开发一个 App 的时候用到了数据库,可是在使用数据库的时候就出现了一些问题,在我查询表中的一些信息时出现了一下问题: Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(

用ADT的FileExplorer查看android手机中的数据库

在这之前首先手机要打开ROOT权限,可以借助安卓刷机精灵等一键ROOT软件 其次像魅族.小米等手机拿到ROOT以后不能执行su命令,所以无法给手机中的文件授权,需要下载一个SuperSU权限管理器 有了他们我们就可以开始下面的步骤了: 1.window->show view->other 2. 输入 file 查找 3. 出来了吧 4. 可惜啊,data文件夹死活打不开啊, 看这个办法 当然在这之前需要把SDK配置到环境变量里面去,这里不再赘述,大家可以去搜索如何配置 On rooted de

将android程序中的数据库导出到SD卡

private void copyDBToSDcrad() { String DATABASE_NAME = "数据库文件名称"; String oldPath = "data/data/com.packagename/databases/" + DATABASE_NAME; String newPath = Environment.getExternalStorageDirectory() + File.separator + DATABASE_NAME; cop