zhonggp 发表于 2018-6-20 19:59:08

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();
}

样例代码下载

Excellence 发表于 2018-6-21 08:23:05

这串口屏可以用C++编程,进行二次开发?

zhonggp 发表于 2018-6-21 10:49:09

Excellence 发表于 2018-6-21 08:23
这串口屏可以用C++编程,进行二次开发?

是的,产品是类串口屏,但不是串口屏这么简单

ericdai 发表于 2018-6-21 11:15:34

把以太网引出了吧 再多几个串口

marshallemon 发表于 2018-6-21 11:53:26

支持加入以太网口和多个串口

huike 发表于 2018-6-21 11:55:26

如果稳定,那么传统的串口屏遇上的最大竞争对手了,原来的串口屏基本只能实现显示的功能。

zhonggp 发表于 2018-6-21 13:43:13

huike 发表于 2018-6-21 11:55
如果稳定,那么传统的串口屏遇上的最大竞争对手了,原来的串口屏基本只能实现显示的功能。 ...

稳定是肯定的。
但是做最大的竞争对手也不是。因为传统串口屏显示有他的应用场景。还真有不会用C,C++开发的工程师。有些还是喜欢写几个简单的指令。

zhonggp 发表于 2018-6-21 13:44:47

marshallemon 发表于 2018-6-21 11:53
支持加入以太网口和多个串口

目前做的板子确实没有考虑好RJ45怎么布局的问题。因为不带外壳,不好处理。

lin28 发表于 2018-6-25 20:47:27

能跑QT吗?跑linux 应该可以集成QT

zhonggp 发表于 2018-6-26 14:05:19

lin28 发表于 2018-6-25 20:47
能跑QT吗?跑linux 应该可以集成QT

我们做的事情就是去QT化,所以当然不能跑QT了。

lin28 发表于 2018-6-27 14:56:07

zhonggp 发表于 2018-6-26 14:05
我们做的事情就是去QT化,所以当然不能跑QT了。

能跑QT一个很大好处是兼容啊。PC端软件直接复制过来用。考虑下啊,QT 做界面也好方便。

zhonggp 发表于 2018-6-28 18:58:19

lin28 发表于 2018-6-27 14:56
能跑QT一个很大好处是兼容啊。PC端软件直接复制过来用。考虑下啊,QT 做界面也好方便。 ...

QT消耗的内存和存储资源都挺大了。不适合这种小型操作系统的初衷。
当然如果有一个更大的平台来运行QT确实是一个好事情。就做成了类似树莓派一样的东西了。

kv2004 发表于 2018-6-28 19:44:25

#include "db/Database.h"

Database dbs("/mnt/extsd/test.db");

是存到外部TF卡吧,如果不用TF卡,应该怎样写呢?

wx-ta 发表于 2018-6-28 22:09:26

这个难道是精简android做成的?

zhonggp 发表于 2018-6-29 12:32:45

wx-ta 发表于 2018-6-28 22:09
这个难道是精简android做成的?

跟精简Android没有太大关系。我们以前用了一套精简Android的。
现在整套都是Linux自己处理的了。

zhonggp 发表于 2018-6-29 12:33:42

kv2004 发表于 2018-6-28 19:44
#include "db/Database.h"

Database dbs("/mnt/extsd/test.db");


可以用内部的data空间/data/test.db
分区大小可定制。默认是1MB

funnynypd 发表于 2018-10-11 01:06:49

>把以太网引出了吧 再多几个串口
Yes. Nice feature.

>Wifi
How to use it?

zhonggp 发表于 2018-10-12 12:42:05

funnynypd 发表于 2018-10-11 01:06
>把以太网引出了吧 再多几个串口
Yes. Nice feature.



wifi 直接使用linux的网络编程,使用socket就可以了。当然你可以使用libcurl

funnynypd 发表于 2018-10-12 21:21:52

>wifi 直接使用linux的网络编程,使用socket就可以了。当然你可以使用libcurl
I knew the Linux has been customized, how useful it is if used for wifi data transfering?

zhonggp 发表于 2018-10-12 21:50:27

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开始

marshallemon 发表于 2018-10-12 22:05:24

能访问远程的SQL SERVER和oracle数据库吗?

zhonggp 发表于 2018-10-25 21:03:07

marshallemon 发表于 2018-10-12 22:05
能访问远程的SQL SERVER和oracle数据库吗?

没有这么尝试过,支持tcp 的编程。应该这个是可以实现的
页: [1]
查看完整版本: SuperView 串口屏移植sqlite数据库以及应用