首页 > 解决方案 > 如何使用切换开始/停止将 onSensorChanged 数据记录到 SQLite?

问题描述

我正在尝试开发一个将加速度计和陀螺仪数据存储到 SQLite 数据库中的应用程序。我已经完成了让加速度计和陀螺仪工作的基本工作。我还设法创建了一个工作数据库,该数据库在应用程序启动时连续记录数据,并包含时间戳。我现在遇到的问题是我想包含一个切换到开始/停止将数据记录到数据库以节省电池和内存,但我无法让它正常工作。我试过使用onCheckedChanged()查看是否按下了切换按钮,但这只会将一行数据添加到数据库中。我想要的是当按下 Toggle 时,数据库应该充满传感器数据,直到再次按下 Toggle。有没有办法做到这一点?任何反馈都会很有用。谢谢

// for accessing accelerometer and gyroscope sensors and displaying them

public class MainActivity extends AppCompatActivity implements LocationListener , SensorEventListener {

    DatabaseHelper myDb;
    private static final String TAG = "MainActivity";
    private TextView xText, yText , zText, xTextGyro, yTextGyro , zTextGyro;
    private ToggleButton toggle;
    private Sensor accelerometer;
    private Sensor gyroscope;
    private SensorManager sM;
    private SensorEventListener accelerometerListener,gyroscopeEventListener;
    public float accelX, accelY, accelZ, gyroX, gyroY, gyroZ;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        myDb = new DatabaseHelper(this);

        //Assign TextViews to specific axises
        xText =  (TextView) findViewById(R.id.xText);
        yText =  (TextView) findViewById(R.id.yText);
        zText =  (TextView) findViewById(R.id.zText);


        xTextGyro = (TextView) findViewById(R.id.xTextGyro);
        yTextGyro = (TextView) findViewById(R.id.yTextGyro);
        zTextGyro = (TextView) findViewById(R.id.zTextGyro);

        toggle = (ToggleButton) findViewById(R.id.toggleButton);   //toggle for start/stop recording

        //Creating the sensor manager; SENSOR_SERVICE is used to access sensors.
        sM = (SensorManager) getSystemService(SENSOR_SERVICE);

        //Accelerometer Sensor.
        accelerometer = sM.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        if(accelerometer != null){

            //Register sensor listener;
            sM.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            Log.d(TAG, "onCreate initializing sensors");

        } else{
            xText.setText("Accelerometer not supported");
            yText.setText("Accelerometer not supported");
            zText.setText("Accelerometer not supported");
        }


        //GYRO Sensor.
        gyroscope = sM.getDefaultSensor(Sensor.TYPE_GYROSCOPE);

        if(gyroscope != null){

            //Register sensor listener;
            sM.registerListener(this, gyroscope, SensorManager.SENSOR_DELAY_NORMAL);
            Log.d(TAG, "onCreate initializing sensors");

        } else{
            xTextGyro.setText("GYROSCOPE not supported");
            yTextGyro.setText("GYROSCOPE not supported");
            zTextGyro.setText("GYROSCOPE not supported");
        }


@Override
    public void onSensorChanged(SensorEvent event) {
        Sensor sensorType = event.sensor;

          if(sensorType.getType()==Sensor.TYPE_ACCELEROMETER) {
            xText.setText("X: " + event.values[0]);
            yText.setText("Y: " + event.values[1]);
            zText.setText("Z: " + event.values[2]);

            accelX = event.values[0];
            accelY = event.values[1];
            accelZ = event.values[2];


        }  else if (sensorType.getType() == Sensor.TYPE_GYROSCOPE){
            xTextGyro.setText("X: " + event.values[0]);
            yTextGyro.setText("Y: " + event.values[1]);
            zTextGyro.setText("Z: " + event.values[2]);

           gyroX = event.values[0];
           gyroY = event.values[1];
           gyroZ = event.values[2];
        }

        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(toggle.isChecked()){

                    DatabaseHelper.getInstance().insertTable(accelX, accelY, accelZ, gyroX, gyroY, gyroZ);
                    Toast.makeText(MainActivity.this, "Recording data...", Toast.LENGTH_SHORT).show();

                }

            }
        });

我的 DatabaseHelper 类:

public class DatabaseHelper extends SQLiteOpenHelper {
    
    public static final String SENSOR_TABLE = "SENSOR_TABLE";
    public static final String COLUMN_ACCEL_X = "ACCEL_X";
    public static final String COLUMN_ACCEL_Y = "ACCEL_Y";
    public static final String COLUMN_ACCEL_Z = "ACCEL_Z";
    
    public static final String COLUMN_GYRO_X = "GYRO_X";
    public static final String COLUMN_GYRO_Y = "GYRO_Y";
    public static final String COLUMN_GYRO_Z = "GYRO_Z";

    private static DatabaseHelper mInstance;

    public DatabaseHelper(Context context) {
        super(context, "AccelButton.db", null, 1);

        SQLiteDatabase db = this.getWritableDatabase();
    }

    public static DatabaseHelper getInstance(){
        if(mInstance == null){
            synchronized (DatabaseHelper.class){
                if(mInstance == null){
                    mInstance = new DatabaseHelper(BaseApp.getApp());
                }
            }
        }
        return mInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //String createTableStatement= "CREATE TABLE " + SENSOR_TABLE + "( " +  COLUMN_ACCEL_X + " REAL, " + COLUMN_ACCEL_Y + " REAL, " + COLUMN_ACCEL_Z + " REAL, time DATETIME DEFAULT CURRENT_TIME)";
        String createTableStatement= "CREATE TABLE " + SENSOR_TABLE + "( time DATETIME DEFAULT CURRENT_TIME, " +  COLUMN_ACCEL_X + " REAL, " + COLUMN_ACCEL_Y + " REAL, " + COLUMN_ACCEL_Z + " REAL, " + COLUMN_GYRO_X + " REAL, " + COLUMN_GYRO_Y + " REAL, " + COLUMN_GYRO_Z + " REAL)";
        db.execSQL(createTableStatement);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+SENSOR_TABLE);
        onCreate(db);

    }

    public void insertTable(float x, float y, float z ,float a, float b , float c){  //put onSensorChanged data to database

        ContentValues contentvalues = new ContentValues();
        contentvalues.put("ACCEL_X", x);
        contentvalues.put("ACCEL_Y", y);
        contentvalues.put("ACCEL_Z", z);

        contentvalues.put("GYRO_X", a);
        contentvalues.put("GYRO_Y", b);
        contentvalues.put("GYRO_Z", c);


        getWritableDatabase().insert(SENSOR_TABLE, null, contentvalues);



    }
}

我的 BaseApp 类:

public class BaseApp extends Application {

        private static BaseApp mInstance ;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;

    }

    public static Application getApp(){
        return mInstance;
    }
}

标签: javasqliteandroid-studioandroid-sqliteandroid-sensors

解决方案


您添加的切换侦听器将报告“onchange”,因此仅当用户点击该按钮时。您应该尽可能少地在 onsensorchanged 内执行操作。移除切换开关,并将其放置在其他位置,如 oncreate。

设置一个标志来跟踪切换何时被激活:

boolean flagToggle = false;

   if(toggle.isChecked()){
        //do stuff when Switch is ON
    flagToggle = true

    } else {
        //do stuff when Switch if OFF
flagToggle = false
    }

在您的 onsensorchanged 上,您可以拥有:

if(flagToggle){
DatabaseHelper.getInstance().insertTable(accelX, accelY, accelZ, gyroX, gyroY, gyroZ);
}

现在应该将数据插入到数据库中。我建议您重构此代码,并将其移到 onsensorchanged 之外。


推荐阅读