基于SuperView 串口屏实现 ARM linux sqlite3数据库的移植和使用方法

SuperView 串口屏 运行的操作系统是中科世为基于Linux 开发的FlyThings OS;系统提供集成GUI开发环境,方便客户快速开发应用。

 

官网链接: www.zkswe.com ;

开发者页面:developer.flythings.comicon-default.png?t=L892http://doc.zkswe.com/;

淘宝页面:superview.taobao.com

这里我们讲解一下如何利用SuperView的显示模组实现sqlite数据库的操作。

新建好一个FlyThings Project 项目。

在jni代码目录中添加 db文件夹。放入从github上下载的sqlite3源码:sqlite3.c ,sqlite3.h

github 路径:https://github.com/zkswe/thirdPart/tree/master/sqlite

设计一个供应用开发使用的Database类

#ifndef JNI_DB_DATABASE_H_
#define JNI_DB_DATABASE_H_


#include <vector>
#include <string>
#include "sqlite3.h"


typedef struct{
	std::string name;
	std::string num;
	std::string age;
	std::string score;
}S_INFOS;




class Database {
public:
	Database(std::string path);
	virtual ~Database();
	void recodeResult(std::string name,std::string num,std::string age,std::string score);
	std::vector<S_INFOS> getRecodes();
	void clear();
	void saveas(std::string path);
private:
	sqlite3* pDB;
	std::vector<S_INFOS> dbs;
};


#endif /* JNI_DB_DATABASE_H_ */
	std::string name;
	std::string num;
	std::string age;
	std::string score;
}S_INFOS;




class Database {
public:
	Database(std::string path);
	virtual ~Database();
	void recodeResult(std::string name,std::string num,std::string age,std::string score);
	std::vector<S_INFOS> getRecodes();
	void clear();
	void saveas(std::string path);
private:
	sqlite3* pDB;
	std::vector<S_INFOS> dbs;
};


#endif /* JNI_DB_DATABASE_H_ */

在Database.cpp 内添加

/*
 * Database.cpp
 *
 *  Created on: 2018年5月27日
 *      Author: Kwolve
 */

#include "Database.h"
#include "utils/Log.h"
#include "uart/ProtocolData.h"
#include "uart/ProtocolParser.h"



void Database::recodeResult(std::string name,std::string num,std::string age,std::string score) {
	std::string sqltestr ="";
	sqltestr += "insert into recode(name,num,age,score) values('"+name+"','"+
			num+"','"+
			age+"','"+
			score+"');";

	char* errmsg;

	LOGD("sqlite exec :%s",sqltestr.c_str());
	if(pDB != NULL){
		int ret = sqlite3_exec(pDB,sqltestr.c_str(),0,0, &errmsg);
		if(ret != SQLITE_OK){
			LOGD("sqlite exec err:%s",errmsg);
		}
	}

}

std::vector<S_INFOS> Database::getRecodes() {
	const char* cmd = "select * from recode";
	char** result;
	int nRow;
	int nCol;
	char* errmsg;
	dbs.clear();
	dbs.empty();
	int ret = sqlite3_get_table(pDB, cmd, &result, &nRow, &nCol, &errmsg);
	if(ret != SQLITE_OK){
		LOGD("select * form recode ret:%s",errmsg);
		return dbs;
	}
	std::string strOut;
   int nIndex = nCol;
   S_INFOS info;
   for(int i=0;i<nRow;i++)
   {
	   info.name = result[nIndex];
	   ++nIndex;
	   info.num = result[nIndex];
	   ++nIndex;
	   info.age = result[nIndex];
	   ++nIndex;
	   info.score = result[nIndex];
	   ++nIndex;
	   dbs.push_back(info);
   }
   LOGD("read size %d",nRow);
   LOGD("read size %d",dbs.size());

	sqlite3_free_table(result);
	return dbs;
}

Database::Database(std::string path) {
	// TODO 自动生成的构造函数存根
	int ret = sqlite3_open(path.c_str(), &pDB);
	if(ret != SQLITE_OK){
		LOGD("open sqlite ret:%d",ret);
		pDB = NULL;
		return;
	}
	const char* cmd = "CREATE TABLE IF NOT EXISTS recode(name,num,age,score);";
	char* errmsg;
	sqlite3_exec(pDB,cmd,0,0, &errmsg);
	if(ret != SQLITE_OK){
		LOGD("create table ret:%s",errmsg);
	}
}

Database::~Database() {
	// TODO 自动生成的析构函数存根
	sqlite3_free(pDB);
}

void Database::clear() {
	const char* cmd = "DELETE FROM recode";
	char* errmsg;
	int ret = sqlite3_exec(pDB,cmd,0,0, &errmsg);
	if(ret != SQLITE_OK){
		LOGD("create DELETE ret:%s",errmsg);
	}
}

void Database::saveas(std::string path) {
}

在Logic/mainLogic.cc 内添加数据库操作代码

  • 定义数据库
#include "db/Database.h"

Database dbs("/mnt/extsd/test.db");
  • 保存时操作
static bool onButtonClick_ButtonSave(ZKButton *pButton) {
    //LOGD(" ButtonClick ButtonSave !!!\n");
	dbs.recodeResult(mEdittextNamePtr->getText(),
			mEdittextNoPtr->getText(),
			mEdittextAgePtr->getText(),
			mEdittextScorePtr->getText());
    return true;
}

数据库读取以及列表显示

  • 新建一个data.ftu 的ui文件,用于展示数据库内容

  • 代码中添加列表显示的部分
#include "db/Database.h"

extern Database dbs;
static std::vector<S_INFOS> pVector;
static int nRows;
static int nSelectRow;
const char* titileTab[]={
		"姓名","学号","年龄","分数"
};
/**
 * 注册定时器
 * 在此数组中添加即可
 */
static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
	//{0,  6000}, //定时器id=0, 时间间隔6秒
	//{1,  1000},
};

static void onUI_init(){
    //Tips :添加 UI初始化的显示代码到这里,如:mText1->setText("123");
	pVector = dbs.getRecodes();
	nRows = pVector.size()+1;
}

static void onUI_quit() {

}


static void onProtocolDataUpdate(const SProtocolData &data) {
    // 串口数据回调接口
}

static bool onUI_Timer(int id){
    //Tips:添加定时器响应的代码到这里,但是需要在本文件的 REGISTER_ACTIVITY_TIMER_TAB 数组中 注册
    //id 是定时器设置时候的标签,这里不要写耗时的操作,否则影响UI刷新,ruturn:[true] 继续运行定时器;[false] 停止运行当前定时器
    return true;
}


static bool ondataActivityTouchEvent(const MotionEvent &ev) {
    // 返回false触摸事件将继续传递到控件上,返回true表示该触摸事件在此被拦截了,不再传递到控件上
    return false;
}
static int getListItemCount_Listview1(const ZKListView *pListView) {
    //LOGD(" getListItemCount_ Listview1  !!!\n");
    return nRows*4;
}

static void obtainListItemData_Listview1(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {
    //LOGD(" obtainListItemData_ Listview1  !!!\n");
	if(index < 4){
		pListItem->setText(titileTab[index]);
	}else{
		int rindex = index-4;
		int row = rindex/4;
		S_INFOS info = pVector.at(row);
		int id = rindex%4;
		switch(id){
		case 0:
			pListItem->setText(info.name);
			break;
		case 1:
			pListItem->setText(info.num);
			break;
		case 2:
			pListItem->setText(info.age);
			break;
		case 3:
			pListItem->setText(info.score);
			break;
		}
	}
}

static void onListItemClick_Listview1(ZKListView *pListView, int index, int id) {
    //LOGD(" onListItemClick_ Listview1  !!!\n");
	nSelectRow = index/4 - 1;
	S_INFOS info = pVector.at(nSelectRow);
	mEdittextNamePtr->setText(info.name);
	mEdittextNoPtr->setText(info.num);
	mEdittextAgePtr->setText(info.age);
	mEdittextSCorePtr->setText(info.score);
	mWindowTipPtr->showWnd();
}

源码下载地址请加入QQ群:371608200

官网链接: www.zkswe.com ;

开发者页面:doc.zkswe.com;

淘宝页面:shop434237749.taobao.com

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Auto Layout可以通过代码实现,以下是一个使用代码实现Auto Layout布局的示例: 首先,创建需要布局的视图,并将其添加到父视图中: ``` UIView *superView = self.view; UIView *subView = [[UIView alloc] init]; subView.translatesAutoresizingMaskIntoConstraints = NO; [superView addSubview:subView]; ``` 然后,使用NSLayoutConstraint类创建需要的约束,并将它们添加到视图中: ``` NSLayoutConstraint *leadingConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:10.0]; NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1.0 constant:10.0]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; [superView addConstraints:@[leadingConstraint, topConstraint]; [subView addConstraints:@[widthConstraint, heightConstraint]]; ``` 在上面的代码中,首先创建了需要布局的子视图subView,并将其添加到父视图superView中。然后,分别创建了leadingConstraint、topConstraint、widthConstraint和heightConstraint四个约束,并将它们添加到superView和subView中。 需要注意的是,使用NSLayoutConstraint类创建约束时,需要指定参照视图、属性和常量等信息,并将约束添加到视图中。使用addConstraints方法可以同时添加多个约束到一个视图中,而使用addConstraint方法可以将单个约束添加到一个视图中。 通过上面的示例,可以看到使用代码实现Auto Layout布局的过程相对繁琐,需要注意各个约束的关系和顺序,但在实际开发中,有时需要使用代码实现布局,因此需要仔细学习和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值