Как использовать переключатель для запуска / остановки записи данных onSensorChanged в SQLite?

#java #sqlite #android-studio #android-sqlite #android-sensors

#java #sqlite #android-studio #android-sqlite #android-датчики

Вопрос:

Я пытаюсь разработать приложение, которое хранит данные акселерометра и гироскопа в базе данных SQLite. Я уже выполнил основную задачу по запуску акселерометра и гироскопа. Мне также удалось создать рабочую базу данных, которая непрерывно записывает данные при включении приложения с включенными временными метками. Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу включить переключатель для запуска / остановки записи данных в базу данных для экономии заряда батареи и памяти, но я не смог заставить его работать должным образом. Я попытался использовать onCheckedChanged(), чтобы увидеть, нажат переключатель или нет, но это добавляет только одну строку данных в базу данных. Я хочу, чтобы при нажатии переключателя база данных заполнялась данными датчиков до тех пор, пока переключатель не будет нажат снова. Есть ли какой-либо способ сделать это? Любая обратная связь была бы полезна. Спасибо

 // 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;
    }
}

 

Ответ №1:

Добавленный вами прослушиватель переключения сообщит «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.

Комментарии:

1. Я сделал то, что посоветовал u, установив флаг для отслеживания переключения во время активации, я поместил его в «onCreate». я также помещаю оператор ‘if (flagToggle)’ внутри ‘onSensorChanged’, но происходит то, что он создает таблицу, но не вставляет значение датчиков. Я делаю что-то не так? Я новичок во всем этом, поэтому я действительно ценю помощь