![](/img/trans.png)
[英]Using room sqlite db for storing key value pairs like sharedpreferences
[英]Storing a float value in SQLite changes the decimal precision in Room DB
我需要將價格存儲在我的房間數據庫中。 我可以得到2位小數或3位小數的小數精度,具體取決於我的應用程序所在的國家/地區。
使用android的房間庫在sqlite數據庫中存儲float或甚至double值時,它會更改值。 例如:14.54存儲為14.539999961853
在調試時,我發現只有在我傳遞給插入的列表中,該值才是14.54。 但是從Windows的SQLite瀏覽器應用程序中檢查已保存的記錄。 我看到價值觀發生了變化。 我使用sqlite瀏覽器手動輸入了一個查詢,值保存原樣(浮點值不改變精度)。 例如:
("INSERT INTO MYTABLE (ItemPrice) VALUES (14.54)");
上面的查詢成功執行並插入14.54的浮點數
但在android中使用以下內容
@Insert
Long[] saveMyTable(final List<MYTABLE> myTable);
MyTable實體的字段為
public float ItemPrice;
插入上述查詢時,值會發生變化
我也嘗試將DB Schema中的數據類型更改為real,float,double。 但沒有任何幫助。
我正在使用房間數據庫用於演示應用程序,那時我的存儲值與上面定義的相同值。 首先為表定義pojo類..
@Entity
public class MyTable {
@PrimaryKey(autoGenerate = true)
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
private double ItemPrice;
public double getItemPrice() {
return ItemPrice;
}
public void setItemPrice(double itemPrice) {
ItemPrice = itemPrice;
}
}
然后在定義dao類之后......
@Dao
public interface MyTableDao {
@Insert
void insertData(MyTable myTable);
}
然后在表格中定義db之后...
@Database(entities = {MyTable.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract MyTableDao getTableDao();
}
然后在主要活動中使用下面的代碼定義db名稱,版本並插入數據...
public class DbInsert extends AppCompatActivity {
AppDatabase db;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "MyDb").allowMainThreadQueries().build();
MyTable myTable = new MyTable();
myTable.setItemPrice(14.54);
db.getTableDao().insertData(myTable);
}
}
我在我的代碼和db模式中浮動它是雙倍的(盡管dosent意味着什么)
但我做了以下事情:1。在代碼和db中使用相同的數據類型(我使用double來表示精度)2。存儲值時。 我完成了雙倍的需求。
public static short COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL;//Dynamically set
private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;
public double roundedDouble(double doubleValue) {
return new
BigDecimal(doubleValue).setScale(COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL,
ROUNDING_MODE).doubleValue();
}
3.上述方法將返回一個帶有2或3位小數的雙精度,具體取決於我在COUNTRY_CURRENCY_MAX_DIGITS_AFTER_DECIMAL中設置的值。 4.最后,我將值存儲在DB中。
Ps:沒有上面的方法,我的浮點數總是會收斂到默認小數的兩倍,我總是得到巨大的價值。
現在它對我來說很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.