SuperView 串口屏移植sqlite数据库以及应用
SuperView 串口屏是中科世为基于FlyThingsOS (OS介绍 https://www.amobbs.com/thread-5693817-1-1.html] https://www.amobbs.com/thread-5693817-1-1.html)开发的一款类串口屏的产品。开发者页面:doc.zkswe.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_ */
在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;
info.num = result;
++nIndex;
info.age = result;
++nIndex;
info.score = result;
++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: 继续运行定时器; 停止运行当前定时器
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);
}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();
}
样例代码下载
这串口屏可以用C++编程,进行二次开发? Excellence 发表于 2018-6-21 08:23
这串口屏可以用C++编程,进行二次开发?
是的,产品是类串口屏,但不是串口屏这么简单 把以太网引出了吧 再多几个串口 支持加入以太网口和多个串口 如果稳定,那么传统的串口屏遇上的最大竞争对手了,原来的串口屏基本只能实现显示的功能。 huike 发表于 2018-6-21 11:55
如果稳定,那么传统的串口屏遇上的最大竞争对手了,原来的串口屏基本只能实现显示的功能。 ...
稳定是肯定的。
但是做最大的竞争对手也不是。因为传统串口屏显示有他的应用场景。还真有不会用C,C++开发的工程师。有些还是喜欢写几个简单的指令。
marshallemon 发表于 2018-6-21 11:53
支持加入以太网口和多个串口
目前做的板子确实没有考虑好RJ45怎么布局的问题。因为不带外壳,不好处理。 能跑QT吗?跑linux 应该可以集成QT lin28 发表于 2018-6-25 20:47
能跑QT吗?跑linux 应该可以集成QT
我们做的事情就是去QT化,所以当然不能跑QT了。 zhonggp 发表于 2018-6-26 14:05
我们做的事情就是去QT化,所以当然不能跑QT了。
能跑QT一个很大好处是兼容啊。PC端软件直接复制过来用。考虑下啊,QT 做界面也好方便。 lin28 发表于 2018-6-27 14:56
能跑QT一个很大好处是兼容啊。PC端软件直接复制过来用。考虑下啊,QT 做界面也好方便。 ...
QT消耗的内存和存储资源都挺大了。不适合这种小型操作系统的初衷。
当然如果有一个更大的平台来运行QT确实是一个好事情。就做成了类似树莓派一样的东西了。 #include "db/Database.h"
Database dbs("/mnt/extsd/test.db");
是存到外部TF卡吧,如果不用TF卡,应该怎样写呢? 这个难道是精简android做成的? wx-ta 发表于 2018-6-28 22:09
这个难道是精简android做成的?
跟精简Android没有太大关系。我们以前用了一套精简Android的。
现在整套都是Linux自己处理的了。 kv2004 发表于 2018-6-28 19:44
#include "db/Database.h"
Database dbs("/mnt/extsd/test.db");
可以用内部的data空间/data/test.db
分区大小可定制。默认是1MB
>把以太网引出了吧 再多几个串口
Yes. Nice feature.
>Wifi
How to use it? funnynypd 发表于 2018-10-11 01:06
>把以太网引出了吧 再多几个串口
Yes. Nice feature.
wifi 直接使用linux的网络编程,使用socket就可以了。当然你可以使用libcurl
>wifi 直接使用linux的网络编程,使用socket就可以了。当然你可以使用libcurl
I knew the Linux has been customized, how useful it is if used for wifi data transfering? funnynypd 发表于 2018-10-12 21:21
>wifi 直接使用linux的网络编程,使用socket就可以了。当然你可以使用libcurl
I knew the Linux has been c ...
这个部分是开放开发的。可以参考这个部分大代码:https://github.com/zkswe/SampleUI/blob/master/jni/SocketClient.cpp
153开始 能访问远程的SQL SERVER和oracle数据库吗? marshallemon 发表于 2018-10-12 22:05
能访问远程的SQL SERVER和oracle数据库吗?
没有这么尝试过,支持tcp 的编程。应该这个是可以实现的
页:
[1]