java - 如何使用切换开始/停止将 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;
}
}
解决方案
您添加的切换侦听器将报告“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 之外。
推荐阅读
- spring - Spring Boot Rest API + Spring Batch
- c++ - 如何测试序列生成器是否会生成预期的项目?
- r - 练习循环
- html - Float 无法覆盖我的整个背景。这是为什么?
- vue.js - 为什么当我更改从list1克隆的另一个list2中的数据时,list1中的数据会自动更改?使用 Vue.Draggable
- alfresco - 如何限制为空垃圾桶
- javascript - 大 O 表示法仅取决于矩阵大小或数据类型(整数,布尔值)?
- c# - 如何转换列表
字典选择查询? - angular - Firebase 登录成功回调未调用
- jquery - 如何在通过 jQuery.get() 加载时修复 Form-Closing-Tag 的自动更改的 DOM-Position