搜索
bottom↓
回复: 21

SuperView 串口屏移植sqlite数据库以及应用

[复制链接]

出0入0汤圆

发表于 2018-6-20 19:59:08 | 显示全部楼层 |阅读模式
SuperView 串口屏是中科世为基于FlyThingsOS (OS介绍 [url= https://www.amobbs.com/thread-5693817-1-1.html] https://www.amobbs.com/thread-5693817-1-1.html[/url])开发的一款类串口屏的产品。
开发者页面: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类
  1. #ifndef JNI_DB_DATABASE_H_
  2. #define JNI_DB_DATABASE_H_


  3. #include <vector>
  4. #include <string>
  5. #include "sqlite3.h"


  6. typedef struct{
  7.         std::string name;
  8.         std::string num;
  9.         std::string age;
  10.         std::string score;
  11. }S_INFOS;




  12. class Database {
  13. public:
  14.         Database(std::string path);
  15.         virtual ~Database();
  16.         void recodeResult(std::string name,std::string num,std::string age,std::string score);
  17.         std::vector<S_INFOS> getRecodes();
  18.         void clear();
  19.         void saveas(std::string path);
  20. private:
  21.         sqlite3* pDB;
  22.         std::vector<S_INFOS> dbs;
  23. };


  24. #endif /* JNI_DB_DATABASE_H_ */
  25. 在Database.cpp 内添加

  26. /*
  27. * Database.cpp
  28. *
  29. *  Created on: 2018年5月27日
  30. *      Author: Kwolve
  31. */

  32. #include "Database.h"
  33. #include "utils/Log.h"
  34. #include "uart/ProtocolData.h"
  35. #include "uart/ProtocolParser.h"



  36. void Database::recodeResult(std::string name,std::string num,std::string age,std::string score) {
  37.         std::string sqltestr ="";
  38.         sqltestr += "insert into recode(name,num,age,score) values('"+name+"','"+
  39.                         num+"','"+
  40.                         age+"','"+
  41.                         score+"');";

  42.         char* errmsg;

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

  50. }

  51. std::vector<S_INFOS> Database::getRecodes() {
  52.         const char* cmd = "select * from recode";
  53.         char** result;
  54.         int nRow;
  55.         int nCol;
  56.         char* errmsg;
  57.         dbs.clear();
  58.         dbs.empty();
  59.         int ret = sqlite3_get_table(pDB, cmd, &result, &nRow, &nCol, &errmsg);
  60.         if(ret != SQLITE_OK){
  61.                 LOGD("select * form recode ret:%s",errmsg);
  62.                 return dbs;
  63.         }
  64.         std::string strOut;
  65.    int nIndex = nCol;
  66.    S_INFOS info;
  67.    for(int i=0;i<nRow;i++)
  68.    {
  69.            info.name = result[nIndex];
  70.            ++nIndex;
  71.            info.num = result[nIndex];
  72.            ++nIndex;
  73.            info.age = result[nIndex];
  74.            ++nIndex;
  75.            info.score = result[nIndex];
  76.            ++nIndex;
  77.            dbs.push_back(info);
  78.    }
  79.    LOGD("read size %d",nRow);
  80.    LOGD("read size %d",dbs.size());

  81.         sqlite3_free_table(result);
  82.         return dbs;
  83. }

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

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

  103. void Database::clear() {
  104.         const char* cmd = "DELETE FROM recode";
  105.         char* errmsg;
  106.         int ret = sqlite3_exec(pDB,cmd,0,0, &errmsg);
  107.         if(ret != SQLITE_OK){
  108.                 LOGD("create DELETE ret:%s",errmsg);
  109.         }
  110. }

  111. void Database::saveas(std::string path) {
  112. }
复制代码

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

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

  2. Database dbs("/mnt/extsd/test.db");
复制代码


保存时操作

  1. static bool onButtonClick_ButtonSave(ZKButton *pButton) {
  2.     //LOGD(" ButtonClick ButtonSave !!!\n");
  3.         dbs.recodeResult(mEdittextNamePtr->getText(),
  4.                         mEdittextNoPtr->getText(),
  5.                         mEdittextAgePtr->getText(),
  6.                         mEdittextScorePtr->getText());
  7.     return true;
  8. }
复制代码


数据库读取以及列表显示

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

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

  2. extern Database dbs;
  3. static std::vector<S_INFOS> pVector;
  4. static int nRows;
  5. static int nSelectRow;
  6. const char* titileTab[]={
  7.                 "姓名","学号","年龄","分数"
  8. };
  9. /**
  10. * 注册定时器
  11. * 在此数组中添加即可
  12. */
  13. static S_ACTIVITY_TIMEER REGISTER_ACTIVITY_TIMER_TAB[] = {
  14.         //{0,  6000}, //定时器id=0, 时间间隔6秒
  15.         //{1,  1000},
  16. };

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

  22. static void onUI_quit() {

  23. }


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

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


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

  40. static void obtainListItemData_Listview1(ZKListView *pListView,ZKListView::ZKListItem *pListItem, int index) {
  41.     //LOGD(" obtainListItemData_ Listview1  !!!\n");
  42.         if(index < 4){
  43.                 pListItem->setText(titileTab[index]);
  44.         }else{
  45.                 int rindex = index-4;
  46.                 int row = rindex/4;
  47.                 S_INFOS info = pVector.at(row);
  48.                 int id = rindex%4;
  49.                 switch(id){
  50.                 case 0:
  51.                         pListItem->setText(info.name);
  52.                         break;
  53.                 case 1:
  54.                         pListItem->setText(info.num);
  55.                         break;
  56.                 case 2:
  57.                         pListItem->setText(info.age);
  58.                         break;
  59.                 case 3:
  60.                         pListItem->setText(info.score);
  61.                         break;
  62.                 }
  63.         }
  64. }

  65. static void onListItemClick_Listview1(ZKListView *pListView, int index, int id) {
  66.     //LOGD(" onListItemClick_ Listview1  !!!\n");
  67.         nSelectRow = index/4 - 1;
  68.         S_INFOS info = pVector.at(nSelectRow);
  69.         mEdittextNamePtr->setText(info.name);
  70.         mEdittextNoPtr->setText(info.num);
  71.         mEdittextAgePtr->setText(info.age);
  72.         mEdittextSCorePtr->setText(info.score);
  73.         mWindowTipPtr->showWnd();
  74. }
复制代码


样例代码下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-6-21 08:23:05 | 显示全部楼层
这串口屏可以用C++编程,进行二次开发?

出0入0汤圆

 楼主| 发表于 2018-6-21 10:49:09 | 显示全部楼层
Excellence 发表于 2018-6-21 08:23
这串口屏可以用C++编程,进行二次开发?

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

出0入0汤圆

发表于 2018-6-21 11:15:34 来自手机 | 显示全部楼层
把以太网引出了吧 再多几个串口

出0入85汤圆

发表于 2018-6-21 11:53:26 | 显示全部楼层
支持加入以太网口和多个串口

出10入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2018-6-21 13:44:47 | 显示全部楼层
marshallemon 发表于 2018-6-21 11:53
支持加入以太网口和多个串口

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

出0入0汤圆

发表于 2018-6-25 20:47:27 | 显示全部楼层
能跑QT吗?  跑linux 应该可以集成QT

出0入0汤圆

 楼主| 发表于 2018-6-26 14:05:19 | 显示全部楼层
lin28 发表于 2018-6-25 20:47
能跑QT吗?  跑linux 应该可以集成QT

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

出0入0汤圆

发表于 2018-6-27 14:56:07 | 显示全部楼层
zhonggp 发表于 2018-6-26 14:05
我们做的事情就是去QT化,所以当然不能跑QT了。

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

出0入0汤圆

 楼主| 发表于 2018-6-28 18:58:19 | 显示全部楼层
lin28 发表于 2018-6-27 14:56
能跑QT一个很大好处是兼容啊。PC端软件直接复制过来用。考虑下啊,  QT 做界面也好方便。 ...

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

出0入12汤圆

发表于 2018-6-28 19:44:25 | 显示全部楼层
#include "db/Database.h"

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

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

出0入0汤圆

发表于 2018-6-28 22:09:26 来自手机 | 显示全部楼层
这个难道是精简android做成的?

出0入0汤圆

 楼主| 发表于 2018-6-29 12:32:45 | 显示全部楼层
wx-ta 发表于 2018-6-28 22:09
这个难道是精简android做成的?

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

出0入0汤圆

 楼主| 发表于 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

出0入0汤圆

发表于 2018-10-11 01:06:49 | 显示全部楼层
>把以太网引出了吧 再多几个串口
Yes. Nice feature.

>Wifi
How to use it?

出0入0汤圆

 楼主| 发表于 2018-10-12 12:42:05 | 显示全部楼层
funnynypd 发表于 2018-10-11 01:06
>把以太网引出了吧 再多几个串口
Yes. Nice feature.

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

出0入0汤圆

发表于 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?

出0入0汤圆

 楼主| 发表于 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/SampleU ... ni/SocketClient.cpp
153开始

出0入85汤圆

发表于 2018-10-12 22:05:24 | 显示全部楼层
能访问远程的SQL SERVER和oracle数据库吗?

出0入0汤圆

 楼主| 发表于 2018-10-25 21:03:07 | 显示全部楼层
marshallemon 发表于 2018-10-12 22:05
能访问远程的SQL SERVER和oracle数据库吗?

没有这么尝试过,支持tcp 的编程。应该这个是可以实现的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 16:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表