如何使用SQL数据库在Android中保存从Arduino板接收的数据?

如何使用SQL数据库在Android中保存从Arduino板接收的数据?,android,sql,database,bluetooth,air,Android,Sql,Database,Bluetooth,Air,目前,我正在使用Arduino开发空气质量监测装置的原型。该设备集成了三个气体传感器,通过HC-05蓝牙模块将数据发送到我的android应用程序。我能够实时接收数据并使用textview显示,但不知道是否必须使用SQL数据库将数据保存在android设备本身。我已经尝试了我在其他地方找到的所有教程,但它只在单击按钮时保存数据,但即使尝试buttonclick方法,应用程序也会崩溃(相反,每次应用程序启动时,我都希望在后台连续保存数据)。我对android开发非常陌生,请帮助我 目前我需要保存(

目前,我正在使用Arduino开发空气质量监测装置的原型。该设备集成了三个气体传感器,通过HC-05蓝牙模块将数据发送到我的android应用程序。我能够实时接收数据并使用textview显示,但不知道是否必须使用SQL数据库将数据保存在android设备本身。我已经尝试了我在其他地方找到的所有教程,但它只在单击按钮时保存数据,但即使尝试buttonclick方法,应用程序也会崩溃(相反,每次应用程序启动时,我都希望在后台连续保存数据)。我对android开发非常陌生,请帮助我

目前我需要保存(时间/日期、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

                }
            }
        }
    };

好的,这里有一些您可以修改的内容,它展示了如何创建数据库和表,然后如何插入数据,以及如何检查数据是否存在

几乎所有的代码都在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
    }
}
  • 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对于类型非常灵活,几乎没有限制,您可以在任何类型的列中存储任何类型的if值)。但是,在从光标提取数据时,您应该选择最合适的
    get????
    方法(下面仅使用
    getString
    方法,仅用于检查是否存在)

    以下代码将列出日志中的数据,仅用于初始重新保证插件正常工作:-

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

    我建议您包括一个应用程序的代码。这应该包括,通过从logcat中相关提取的错误,活动和databasehelper中的相关代码(即作为SQLiteOpenHelper子类的类)或者使用任何其他方法创建数据库,如果有的话,还可以使用存储数据的代码。关于SQL,您的意思是要将数据保存在SQLite数据库中吗?如果你不确定,我建议你阅读,底部有一个有用的清单。SQL本身不是一个数据库管理系统,而是一种用于访问数据库的语言。e、 SQLite使用SQL,MySQL使用SQL等等。它工作得非常好,我为使它工作了一个多月,你在一小时内解决了它。非常感谢你的帮助,米凯特。你是我的救世主,我只剩下3个月的时间来完成我最后一年的计划。@kampungboboi听到这个消息太好了。
        // Check data (writes to the log)
        dbhlpr.showAllDataToLog();