源:c调sqlite 在android下编译成可执行文件

 一、aos系统源码下mmm编译

 

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= sqlitedemo.c
LOCAL_SHARED_LIBRARIES := \
	libsqlite 
LOCAL_MODULE:= sqlitedemo
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)

sqlitedemo.c(下同)

#include <stdio.h>
#include <stdlib.h> //exit等函数的声明
#include "sqlite3.h"
 
int displaycb(void *para,int n_column,char **column_value,char **column_name);
 
int inquire_Usecb(sqlite3 *db);
 
int inquire_nocb(sqlite3 *db);
 
int createTable(sqlite3 *db);
 
int insertRecord(sqlite3 *db);
 
int deleteRecord(sqlite3 *db);
 
//回调函数格式
/* 
int sqlite_callback( 
void* pvoid,  //由 sqlite3_exec() 的第四个参数传递而来 
int argc,  //表的列数 
char** argv, //指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到  
char** col //指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 
); 
*/
 
//回调函数 每一条记录执行一次
int displaycb(void *para,int n_column,char **column_value,char **column_name)
{
	int i = 0;
	printf("Total column is %d\n",n_column);
	for(i = 0;i<n_column;i++){
		printf("字段名: %s---->字段值:%s\n",column_name[i],column_value[i]);
	}
	printf("==========================\n");
	return 0;
}

//使用回调函数的查询
int inquire_Usecb(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	sql = "select * from 'SensorData';";
	if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	return 0;
}


//不使用回调函数的查询
int inquire_nocb(sqlite3 *db)
{
	int nrow = 0,ncolumn = 0;
	char **azResult=0;
	int i = 0;
	char *sql;
	char *zErrMsg;
	sql = "SELECT * FROM SensorData";
	if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	printf("row:%d column = %d\n",nrow,ncolumn);
	printf("The result of querying is :\n");
	for ( i = 0;i < ( nrow + 1) * ncolumn; i++)
		printf("azResult[%d] = %s\n",i,azResult[i]);
	sqlite3_free_table(azResult);
	return 0;
}
//创建表函数
int createTable(sqlite3 *db)
{
	char *zErrMsg = 0;
	char *sql = "CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTERER,Time VARCHAR(12),SensorParameter REAL);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	return 0;
}
//插入数据函数
int insertRecord(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	sql = "INSERT INTO 'SensorData' VALUES(NULL,101,261,'20100314',18.9);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	sql = "INSERT INTO 'SensorData' VALUES(NULL,369,281,'20100616',113);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	sql = "INSERT INTO 'SensorData' VALUES(NULL,667,290,'20110315',27);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	sql = "INSERT INTO 'SensorData' VALUES(NULL,865,300,'20120616',323);";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	return 0;
}

//改
int updateRecord(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	char **azResult=0;
	int nrow = 0,ncolumn = 0;
	int i;
	sql = "UPDATE SensorData set SensorID = 66, SiteNum = 666, Time = '66666666' where ID=1; ";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}

	sql = "SELECT * FROM SensorData;";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	printf("row:%d column:%d\n",nrow,ncolumn);
	printf("After updateRecord,the result of querying is :\n");
	for(i=0;i<(nrow+1)*ncolumn;i++)
		printf("azResult[%d] = %s\n",i,azResult[i]);

	return 0;
}

//删除数据函数
int deleteRecord(sqlite3 *db)
{
	char *sql;
	char *zErrMsg;
	char **azResult=0;
	int nrow = 0,ncolumn = 0;
	int i;
	sql = "DELETE FROM SensorData WHERE ID=4;";
	if(SQLITE_OK != sqlite3_exec(db,sql,0,0,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
 
	sql = "SELECT * FROM SensorData;";
	if(SQLITE_OK != sqlite3_get_table(db,sql,&azResult ,&nrow,&ncolumn,&zErrMsg)){
		printf("operate failed: %s\n",zErrMsg);
	}
	printf("row:%d column:%d\n",nrow,ncolumn);
	printf("After deleting,the result of querying is :\n");
	for(i=0;i<(nrow+1)*ncolumn;i++)
		printf("azResult[%d] = %s\n",i,azResult[i]);
	sqlite3_free_table(azResult);
	return 0;
}


int main(void)
{
	sqlite3 *db = NULL;
	int rc;
 
	//打开指定的数据库文件
	rc = sqlite3_open("/data/mydatabase.db",&db);
	if(rc){
		fprintf(stderr,"can't open database: %s\n",sqlite3_errmsg(db));
		sqlite3_close(db);
		exit(1);
	}else
		printf("You have opened a sqlite3 database successfully!\n");
	
	printf("-----------------------------------\n"); 
	//创建表
	createTable(db);
	
	printf("-----------------------------------\n"); 
	//插入记录
	insertRecord(db);
	
	printf("-----------------------------------\n"); 
	//查询
	//使用sqlite3_get_table实现查询
	inquire_nocb(db);


	printf("-----------------------------------\n"); 
	//使用回调函数实现查询
	/*inquire_Usecb(db);*/
	

	printf("-----------------------------------\n"); 
	//修改数据
	updateRecord(db);//101->666
	

	printf("-----------------------------------\n"); 
	//删除记录
	deleteRecord(db);
	
	
	printf("-----------------------------------\n"); 
	//关闭数据库
	sqlite3_close(db);
	return 0;
}

 

 

 

二、ndk编译

1.介绍

#编译方法(linux下):
cd your_project_dir
rm libs  obj -rf
cd jni/
ndk-build


#sqlitedemo使用方法
adb shell rm /system/bin/sqlitedemo
adb push libs/armeabi/sqlitedemo /system/bin/
adb shell ./system/bin/sqlitedemo




#编译前的源码目录结构
tree sqlitedemo/
 
├── jni
│   ├── Android.mk
│   ├── Application.mk
│   ├── libsqlite.so
│   ├── sqlite3.h
│   └── sqlitedemo.c
└── README.md



#编译后的源码目录结构
tree sqlitedemo/

sqlitedemo/
├── jni
│   ├── Android.mk
│   ├── Application.mk
│   ├── libsqlite.so
│   ├── sqlite3.h
│   └── sqlitedemo.c
├── libs
│   └── armeabi
│       └── sqlitedemo
├── obj
│   └── local
│       └── armeabi
│           ├── objs
│           │   └── sqlitedemo
│           │       ├── sqlitedemo.o
│           │       └── sqlitedemo.o.d
│           └── sqlitedemo
└── README.md

2.源码

cat jni/Android.mk

 
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= sqlitedemo.c
LOCAL_LDLIBS := libsqlite.so
LOCAL_MODULE:= sqlitedemo
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
LOCAL_MODULE_TAGS := eng
include $(BUILD_EXECUTABLE)

 

cat jni/Application.mk


#APP_BUILD_SCRIPT := Android.mk
#APP_ABI := armeabi-v7a x86
APP_ABI := armeabi
APP_STL := gnustl_static
APP_PLATFORM := android-23

 

sqlitedemo.c(同一)

 

目录结构及编译方法README.md

 

 

运行结果:

You have opened a sqlite3 database successfully!
-----------------------------------
-----------------------------------
-----------------------------------
row:4 column = 5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 101
azResult[7] = 261
azResult[8] = 20100314
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 369
azResult[12] = 281
azResult[13] = 20100616
azResult[14] = 113.0
azResult[15] = 3
azResult[16] = 667
azResult[17] = 290
azResult[18] = 20110315
azResult[19] = 27.0
azResult[20] = 4
azResult[21] = 865
azResult[22] = 300
azResult[23] = 20120616
azResult[24] = 323.0
-----------------------------------
-----------------------------------
row:0 column:0
After updateRecord,the result of querying is :
-----------------------------------
row:3 column:5
After deleting,the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 66
azResult[7] = 666
azResult[8] = 66666666
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 369
azResult[12] = 281
azResult[13] = 20100616
azResult[14] = 113.0
azResult[15] = 3
azResult[16] = 667
azResult[17] = 290
azResult[18] = 20110315
azResult[19] = 27.0
-----------------------------------

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.创建一个DataBaseHelper DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 2.提供了onCreate()和onUpdate()两个回函数,允许我们常见和升级数据库是进行使用 A、 在SQLiteOpenHelper的子类当中,必须要有的构造函数 B、该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDataBase对象的时候onCreate 二、创建一个实体person类并且给字段和封装 三、创建一个业务类对SQL的CRUD操作 1.getWritableDatabase()和getReadableDatabase()的区别 ,两个方法都可以获取一个用于操作数据库的SQLiteDatabase实例 2.execSQL(增,删,改都是这个方法)和close();android内部有缓存可关闭也不关闭也行,查询rawQuery是方法 3.在分页有到Cursor(游标)取游标下一个值cursor.moveToNext(),用游标对象接数据 "select * from person limit ?,?" person不能加上where 关键字 4.在删除注意:sb.deleteCharAt(sb.length() - 1); 四、AndroidCRUD业务对SQLite的CRUD操作 1.ContentValues对象的使用 2.android内部insert添加数据的方法,而且values这个不给值也必须要执行,而主键是不是null的其他字段的值是为null 3.insert update query delete 五、单元测试类要注意的 AndroidCRUDService curdService = new AndroidCRUDService(this.getContext()); /* * 注意:getContext必须在我们使用前已经注解进去的,在使用前要实力化,而且是使用后才有上下文 *一般设置为局部对象 */ 六、AndroidManifest.xml的配置 <!-- 配置用户类库android.test.runner测试 --> package jll.sqlitedb; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; /** * *@author Administrator DataBaseHelper是一个访问SQLite的助类,提供两个方面的功能 * 1.getReadableDatebase(),getWriteableDatabase()可以获取SQLiteDatabase对象,通过 * 2.提供了onCreate()和onUpdate()两个回函数,允许我们常见和升级数据库是进行使用 */ public class DataBaseHelper extends SQLiteOpenHelper { // 给一个默认的SQLite的数据库名 private static final String DataBaseName = "SQLite_DB"; private static final int VERSION = 2; // 在SQLiteOpenHelper的子类当中,必须要有的构造函数 public DataBaseHelper(Context context, String name, CursorFacto

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值