2017-04-19 158 views
-1

這是我第一個帶有float的SQLite數據庫。我無法弄清楚爲什麼我無法存儲/檢索浮點數的小數部分。Android SQLite數據庫 - 沒有讀取數據庫中float的小數部分

的數據庫定義爲:

@Override 
public void onCreate(SQLiteDatabase db){ 
    // Create a string that contains the SQL statement to create the Nbmc device table 
    String SQL_CREATE_NBMC_TEMP_DATA_TABLE = "CREATE TABLE " + NbmcContract.NmbcTempData.TABLE_NAME + " (" 
      + NbmcContract.NmbcTempData._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + NbmcContract.NmbcTempData.COLUMN_TIMESTAMP + " TEXT NOT NULL, " 
      + NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT + " REAL) "; 

    db.execSQL(SQL_CREATE_NBMC_TEMP_DATA_TABLE); 
} 

我從存儲服務活動漂浮在這點數據:

private static double lastSensorTempReading; 
      // ============ TEMP ================== 
      else if (UUID_SENSOR_FFF2.equals(characteristic.getUuid())) { 
       rxSensorDataType = FFF2_TEMP_CONST; 
       descStringBuilder.append("Elapsed Time: " + timeFormat.format(timeDiff) + "\n"); 

      // temp comes in two bytes: newData[MSB], newData[LSB] 
      // temp = MSB + (0.1 * LSB) 
      int iTempMsb_i = (int) newData[0] & 0xff ; 
      int iTempLsb_i = (int) newData[1] & 0xff; 
      lastSensorTempReading = (float)iTempMsb_i + (0.10 * (float)iTempLsb_i); 

      Log.v("broadcastUpdate","Temp = " + lastSensorTempReading); 

      // Add this data to the temp Db 
      tempValues.put(NbmcContract.NmbcTempData.COLUMN_TIMESTAMP, estimatedTime); 
      tempValues.put(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT, lastSensorTempReading); 
      newRowId = db_temp.insert(NbmcContract.NmbcTempData.TABLE_NAME, null, tempValues); 
     } 

而且,當我使用Log.v轉儲值I認爲我存儲它看起來是正確的(當它通過intent發送給主要活動時它看起來正確)。

V/broadcastUpdate: Temp = 33.3 

然而,當我看到它在我的MainActivity SQLite數據庫回來,我失去了後面的小數點浮點/雙精度的一部分,但我沒有收到在logcat中報告的錯誤。

 sb.append(" ------------------- Temperature Data -------------------------\n"); 
     nbmcTempDbHelper = new NbmcTempDataDbHelper(this.getApplicationContext()); 
     SQLiteDatabase tmpDb = nbmcTempDbHelper.getReadableDatabase(); 
     c = tmpDb.rawQuery(" SELECT " + NbmcContract.NmbcTempData._ID + ", " 
       + NbmcContract.NmbcTempData.COLUMN_TIMESTAMP + ", " 
       + NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT + 
       " FROM " + NbmcContract.NmbcTempData.TABLE_NAME + 
       " LIMIT " + MAX_RESULTS_RETRIEVED + " OFFSET " + 0, null); 
     try { 
      if (c != null) { 
       if (c.moveToFirst()) { 
        do { 
         String tempRowId = c.getString(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData._ID)); 
         String tempTimeString = c.getString(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_TIMESTAMP)); 
         double tempDataDbl = c.getInt(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT)); 
         Log.v("getEmailText", "Temp reading = " + tempDataDbl); 
         sb.append(tempRowId); 
         sb.append(DELIMITER); 
         sb.append(tempTimeString); 
         sb.append(DELIMITER); 
         sb.append(tempDataDbl); 
         sb.append(NEW_LINE); 
        } while (c.moveToNext()); 
       } 
      } 
     } finally { 
      c.close(); 
      tmpDb.close(); 
     } 

V/getEmailText: Temp reading = 30.0 
V/getEmailText: Temp reading = 30.0 
V/getEmailText: Temp reading = 30.0 
V/getEmailText: Temp reading = 30.0 

回答

0

的問題是在這條線

double tempDataDbl = c.getInt(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT)); 

當您保存Double要檢索的Integer。只要將行改爲

double tempDataDbl = c.getDouble(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT)); 

不幸的是AFAIK沒有辦法得到類型不匹配。如果您通讀了Data Types in SQLite它說:

在SQLite中,值的數據類型與值本身,而不是與其容器關聯。 SQLite的動態類型系統向後兼容其他數據庫引擎的更常見的靜態類型系統,因爲在靜態類型數據庫上工作的SQL語句應該在SQLite中以相同的方式工作。但是,SQLite中的動態類型允許它執行傳統的嚴格類型數據庫中不可能的事情。

因爲任何容器例如您的案例中的INTEGERREAL可以容納任何和各種數據類型,甚至數據庫也不知道它正在讀取哪種類型。

+0

感謝阿巴斯。有沒有辦法讓它給我類似於gcc中的-Wall標誌的類型不匹配警告? – Excelsior1024

+0

@ Excelsior1024檢查我更新的答案。 – Abbas

0

是的,親愛的
問題是在提取時間您的代碼有一些問題。

double tempDataDbl = c.getInt(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT)); 

將其更改爲

double tempDataDbl = c.getDouble(c.getColumnIndexOrThrow(NbmcContract.NmbcTempData.COLUMN_DATA_FLOAT)); 
+0

非常感謝!我無法相信我忽視了多久! (爲什麼它沒有提出關於類型不匹配的警告?) – Excelsior1024