2017-04-19 161 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