2017-09-23 148 views
2

目前我开发使用Arduino的空气质量监测设备的原型。该设备集成了三个气体传感器,将数据通过HC-05蓝牙模块发送到我的android应用程序。我能够实时接收值并使用textview显示它,但不知道必须使用SQL数据库将数据保存在android设备本身中。我已经试过,我发现其他地方的所有教程,但它只能保存按钮上点击数据,但尝试buttonclick方法即使在应用程序崩溃(而不是我想继续保存在后台的数据,每一个应用程序启动时)。我对android开发很陌生,请帮助我。如何保存从Android的Arduino板使用SQL数据库收到的数据?

目前我需要保存(时间/日期,GPS坐标,传感器1数据,传感器2数据,传感器3的数据,总体空气质量)。

对不起,已经删除了SQL存储部分,这里从Arduino的获取实时数据的代码。

//data received from Arduino as #data+data+data+~ 
    bluetoothIn = new Handler() { 
     public void handleMessage(Message msg) { 
      if (msg.what == handlerState) { //if message is what we want 
       String readMessage = (String) msg.obj; // msg.arg1 = bytes from connect thread 
       recDataString.append(readMessage); //keep appending to string until ~ 
       int endOfLineIndex = recDataString.indexOf("~"); // determine the end-of-line 
       if (endOfLineIndex > 0) { // make sure there data before ~ 
        String dataInPrint = recDataString.substring(0, endOfLineIndex); 

        if (recDataString.charAt(0) == '#') //if it starts with # we know it is what we are looking for 
        { 

         dataInPrint = dataInPrint.substring(1, dataInPrint.length() - 1); //remove the Hash tag symbol 
         StringTokenizer st = new StringTokenizer(dataInPrint,"+"); 
         String sensor0 = st.nextToken(); 
         String sensor1 = st.nextToken(); 
         String sensor2 = st.nextToken(); 


         showMq135.setText(sensor0); //update the textviews with sensor values 
         showMq9.setText(sensor1); 
         showDust.setText(sensor2); 


         p1 = (ProgressBar) findViewById(R.id.progressBarMq135); 
         int p135 = Integer.parseInt(sensor0); 
         p1.setMax(100); 
         p1.setProgress(p135); 




         p2 = (ProgressBar) findViewById(R.id.progressBarMq9); 
         int p9 = Integer.parseInt(sensor1); 
         p2.setMax(100); 
         p2.setProgress(p9); 




         p3 = (ProgressBar) findViewById(R.id.progressBarDust); 
         int pDust = Integer.parseInt(sensor2); 
         p3.setMax(100); 
         p3.setProgress(pDust); 




         if (p135 >= 51 || p9 >= 51 || pDust >= 51) { 

          showAirQuality.setTextColor(Color.RED); 
          showAirQuality.setText("Hazardous/Very unhealthy"); 
          sound.start(); 
         } 

         else { 
          showAirQuality.setTextColor(Color.BLUE); 
          showAirQuality.setText("Normal/Intermediate"); 
         } 


        } 
        recDataString.delete(0, recDataString.length());//clear all string data 

       } 
      } 
     } 
    }; 
+0

我建议你包括一个[最少的代码,完整且可验证的示例](https://stackoverflow.com/help/mcve)。这应包括,从logcat中,初步认识代码从活动和databasehelper(即类是SQLiteOpenHelper的子类)用于创建数据库或任何其他方法的相关提取物的方式,如果错误任您用来存储数据的代码。 – MikeT

+0

关于SQL你的意思是你想将数据保存在SQLite数据库?如果不确定的话,那么我建议你阅读[宜用SQLite的(https://www.sqlite.org/whentouse.html),有在底部的有用清单。 SQL本身不是数据库管理系统,而是用于访问数据库的语言。例如SQLite使用SQL,MySQL使用SQL等。 – MikeT

回答

1

确定这里的东西,你能适应,它展示了如何创建数据库和表(一个或多个),然后如何插入数据,也是一个如何做一个检查检查数据是否存在。

几乎所有的代码是在SQLiteOpenHelp子类,这对于我的方便我呼吁so46375780DBHelper(你很可能重新命名这个),这应该是在一个名为so46375780DBHelper.java文件: -

public class so46375780DBHelper extends SQLiteOpenHelper { 

    public static final String DBNAME = "airquality"; 
    public static final int DBVERSION = 1; 
    public static final String READINGS_TBL = "air_readings"; 
    public static final String READINGID_COL = "_id"; 
    public static final String READINGTIMESTAMP_COL = "timestamp"; 
    public static final String READINGLOCATION_COL = "location"; 
    public static final String READINGSENSOR1_COL = "sensor1"; 
    public static final String READINGSENSOR2_COL = "sensor2"; 
    public static final String READINGSENSOR3_COL = "sensor3"; 
    public static final String READINGAIRQLTY_COL = "airquality"; 

    SQLiteDatabase db; 

    // SQL to create the table 
    String tblcrtsql = "CREATE TABLE " + READINGS_TBL + "(" + 
      READINGID_COL + " INTEGER PRIMARY KEY, " + // unqiue identifier 
      READINGTIMESTAMP_COL + " INTEGER, " + 
      READINGLOCATION_COL + " TEXT, " + 
      READINGSENSOR1_COL + " TEXT, " + 
      READINGSENSOR2_COL + " TEXT, " + 
      READINGSENSOR3_COL + " TEXT, " + 
      READINGAIRQLTY_COL + " TEXT" + 
      ")"; 

    // Database Helper Constructor 
    so46375780DBHelper(Context context) { 
     super(context, DBNAME, null, DBVERSION); 
     db = this.getWritableDatabase(); // Open the database 
    } 

    @Override 
    // Called when Database is openbed when it doesn't already exist 
    // ^^^^^^^^ IMPORTANT to note ^^^^^^^^ 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(tblcrtsql); // Create the table(s) 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversio) { 

    } 

    public boolean insertReading(String location, 
           String sensor1, 
           String sensor2, 
           String sensor3, 
           String airquality) { 
     ContentValues cv = new ContentValues(); 
     cv.put(READINGTIMESTAMP_COL, 
       Long.toString(
       System.currentTimeMillis() 
       ) 
     ); 
     cv.put(READINGLOCATION_COL,location); 
     cv.put(READINGSENSOR1_COL,sensor1); 
     cv.put(READINGSENSOR2_COL,sensor2); 
     cv.put(READINGSENSOR3_COL,sensor3); 
     cv.put(READINGAIRQLTY_COL,airquality); 
     return (db.insert(READINGS_TBL,null,cv) < 1); 
    } 

    public void showAllDataToLog() { 

     //get all rows eqv to SELECT * FROM air_readings; 
     Cursor csr = db.query(READINGS_TBL,null,null,null,null,null,null); 
     // Traverse the cursor 
     while (csr.moveToNext()) { 
      String rowinfo = "Row " + 
        csr.getPosition() + 
        " of " + 
        csr.getCount() + "."; 
      for (int i=0; i < csr.getColumnCount();i++) { 
       rowinfo = rowinfo + 
         "\n\t Column=" + csr.getColumnName(i) + 
         "\t Value=" + csr.getString(i); 
      } 
      Log.d("DBINFO",rowinfo); 
     } 
     csr.close(); // Should always close cursor when finished with them 
    } 
} 

总之你有

  • 类变量声明,
  • 种的构造器
  • overidden方法onCreateonUpgrade(两者必需的,但不一定需要做任何事),其使用所述的SQLite update方法,其利用一ContentValues对象的列/值对
  • insertReadings方法。如果插入成功,此方法将返回1或更大的值(rowid等于_id列)。
  • showAllDataToLog只是为了检查数据是否存在。

接下来只需要2个步骤来启用插入数据,这些步骤放置在将插入数据的类(或类)中。

  • 1创建SQLiteOpenHelper子类的一个实例,例如: -

    so46375780DBHelper dbhlpr = new so46375780DBHelper(this); 
    
  • 2使用insertReading方法例如插入一些数据: -

    // Insert a row 
    dbhlpr.insertReading(
         "001,345",   //coords 
         "76.5",    // sensor 1 reading 
         "57.3",    // sensor 2 reading 
         "12.6",    // sensor 2 reading 
         "LOUSY"    // air quality 
    ); 
    

注意!由读数,你也不妨改变方法,利用更多的相关类型(注SQLite是有类型极其灵活,与一些限制,你可以,如果存储任何类型的任何类型的列的值)。然而,当涉及到从游标中提取数据,你应该选择最合适的方法get?????(以下仅getString方法用于这是确定的只是检查是否存在)。

下面的代码将列出数据日志,它仅用于初始的重保证,刀片工作: -

// Check data (writes to the log) 
    dbhlpr.showAllDataToLog(); 
+0

它完美,我在一个月奋斗弥补这方面的工作,你一小时内解决它。认真感谢你的帮助MikeT。你是我的救星,我只剩下3个月完成我的最后一年的项目。 – kampungboboi

+0

@kampungboboi极大地听到。 – MikeT

相关问题