繁体   English   中英

使用SQLite记录传感器数据

[英]Using SQLite to record sensor data

我是Android新手。 我正在研究Android手机中的磁传感器。 我能够访问磁传感器并将传感器数据记录到.csv文件中。 但我想将其记录在SQLite中。 问题是可以在主要活动中的onSensorChanged方法中获取磁传感器数据,而我不知道如何在SQLite中准备可以从主要活动中获取数据的插入类。 我已经粘贴了获取数据和DBHelper类的代码。

任何帮助将是有用的。 先感谢您。

 // For accessing and displaying magnetic data public class MainActivity extends AppCompatActivity implements SensorEventListener { Sensor magnetometer; SensorManager sm; TextView magnetismx; TextView magnetismy; TextView magnetismz; DBHelper dbHelper; public float a; public float b; public float c; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL); magnetismx = (TextView) findViewById(R.id.magnetismx); magnetismy = (TextView) findViewById(R.id.magnetismy); magnetismz = (TextView) findViewById(R.id.magnetismz); magnetometer = sm.getDefaultSensor(magnetometer.TYPE_MAGNETIC_FIELD); if (magnetometer == null) { Toast.makeText(this, "Magnetometer not available", Toast.LENGTH_SHORT).show(); finish(); } @Override public void onSensorChanged(SensorEvent event) { Sensor sensor = event.sensor; a = event.values[0]; b = event.values[1]; c = event.values[2]; if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { magnetismx.setText(Float.toString(event.values[0])); magnetismy.setText(Float.toString(event.values[1])); magnetismz.setText(Float.toString(event.values[2])); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } } // my dbHelper class public class DBHelper extends SQLiteOpenHelper{ private static final String DB_NAME = "Mag_Positioning.db"; private static final int DB_VERSION = 1; private static final String COL_ID = "ID"; private static final String COLXAXIS = "X-AXIS"; private static final String TABLENAME = "MAP_COORDINATES"; private static final String COLYAXIS = "Y-AXIS"; private static final String COLZAXIS = "Z-AXIS"; public DBHelper(Context context){ super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String createTable = "CREATE TABLE " + TABLENAME + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ," + COLXAXIS + " INTEGER, " + COLYAXIS + " INTEGER, " + COLZAXIS + " INTEGER )"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLENAME); onCreate(db); } public void insert(Integer x, Integer y, Integer z, SQLiteDatabase db ) { ContentValues contentvalues = new ContentValues(); contentvalues.put("X-AXIS", x); contentvalues.put("Y-AXIS", y); contentvalues.put("Z-AXIS", z); db.insert("MAP_COORDINATES", null, contentvalues); } } 

像这样将数据库类更改为单例,并将数据类型从Integer更改为REAL,因为您将要存储浮点值,

注意:“-”在sqlite名称中无效,因此我将其更改为“ _”,例如在X-AXIS中已转换为X_AXIS。

public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "Mag_Positioning.db";
    private static final int DB_VERSION = 1;
    private static final String COL_ID = "ID";
    private static final String COLXAXIS = "X_AXIS";
    private static final String TABLENAME = "MAP_COORDINATES";
    private static final String COLYAXIS = "Y_AXIS";
    private static final String COLZAXIS = "Z_AXIS";

    private static DBHelper mInstance;

    private DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

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

        return mInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLENAME + "(" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ," +
                COLXAXIS + " REAL, " +
                COLYAXIS + " REAL, " +
                COLZAXIS + " REAL )";
        db.execSQL(createTable);

    }

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

    public void insert(float x, float y, float z) {

        ContentValues contentvalues = new ContentValues();
        contentvalues.put("X-AXIS", x);
        contentvalues.put("Y-AXIS", y);
        contentvalues.put("Z-AXIS", z);
        getWritableDatabase().insert("MAP_COORDINATES", null, contentvalues);
    }
}

如果您已经拥有BaseApplication类,则只需忽略以下代码

public class BaseApp extends Application {

    private static BaseApp mInstance;

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

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

检查是否在mainfest文件中添加了基类,

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:name=".BaseApp"
    android:theme="@style/AppTheme">
</application>

获取传感器数据后,您可以这样调用,

public void onSensorChanged(SensorEvent event) {
    Sensor sensor = event.sensor;
    a = event.values[0];
    b = event.values[1];
    c = event.values[2];

    if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {

        DBHelper.getInstance().insert(a, b, c);
    }
}

通常,在使用数据库帮助程序类时,您只希望具有该对象的一个​​实例。 可以这样实现:

DBHelper.java

public class DBHelper extends SQLiteOpenHelper{
....

    private static DBHelper instance;

    public static DBHelper getInstance (Context context) {
        if (instance == null)
            instace = new DBHelper (context);
        return instance;
     }

    private DBHelper (Context context) // Notice the private constructor 
        ....
    }

    ....
}

现在可以从您的Activity中使用DBHelper.getInstance (this)访问该帮助器。

注意:这称为单例模式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM