#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’, но происходит то, что он создает таблицу, но не вставляет значение датчиков. Я делаю что-то не так? Я новичок во всем этом, поэтому я действительно ценю помощь