2017-06-23 116 views
0

我是Android新手。我正在研究Android手機中的磁性傳感器。我可以訪問磁性傳感器並將傳感器數據記錄到.csv文件中。但我想在SQLite中記錄它。問題是磁性傳感器數據可以在主要活動的onSensorChanged方法中獲得,我不知道如何在SQLite中準備插入類,它可以從主要活動中獲取數據。我粘貼了獲取數據和DBHelper類的代碼。使用SQLite記錄傳感器數據

任何幫助將是有用的。先謝謝你。

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

+0

你有什麼問題? – Karakuri

回答

2

您可以像這樣更改您的DB類爲單例,並將數據類型整數更改爲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); 
    } 
} 
+0

謝謝。會試試這個。 –

+0

我在運行程序時出錯。該程序意外停止。錯誤是1)SQLiteLog:接近「 - 」:語法錯誤和2)傳感器管理器:異常調度輸入事件。我如何解決它? –

+0

「 - 」表中的列名無效,我更新了我的答案看看。 –

1

通常使用數據庫時,助手類只希望有對象的一個​​實例。 這可以實現這樣的:

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 
     .... 
    } 

    .... 
} 

現在助手可以DBHelper.getInstance (this)從您的活動進行訪問

注:這就是所謂的單例模式

+0

謝謝你的幫助 –