使用SQLiteStatement将带左边填充零的数字绑定为String

时间:2018-04-08 18:50:51

标签: android android-sqlite

令人惊讶的是,我刚刚意识到SQLiteStatement无法正确绑定一个带左边填充为零的数字。

示例:

SQLiteStatement insertSqlStatement = 
    db.compileStatement("INSERT INTO table(column) VALUES(?)");
insertSqlStatement.bindString(0, "00012");
insertSqlStatement.executeInsert();
// "12" is inserted, instead of "00012"

这不起作用:

insertSqlStatement.bindString(0, "'00012'");
// "'12'" is inserted

这会导致错误:

db.compileStatement("INSERT INTO table(column) VALUES('?')");

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你的问题,即假设“错误”是0的丢失,是对 SQLite 如何最小化存储数据量的误解。

该数据的存储方式(存储类)受列类型(又名亲和力)的影响。简而言之,如果列没有TEXT或BLOB的类型亲和力,那么它将具有数字类型亲和力并以最小的形式存储数字,从而丢弃数字上无用的0。

如果您需要存储0,那么理想情况下您应该使用类型为TEXT的列,这意味着该列应声明为包含 TEXT CHAR CLOB 但不包含 INT INTEGER

按照: -

  

<强> 3.1。柱亲和力的测定

     

根据声明的列类型确定列的亲和力   按照显示的顺序遵循规则:

     
      
  1. 如果声明的类型包含字符串“INT”,则分配它   INTEGER亲和力。

  2.   
  3. 如果声明的列类型包含任何字符串“CHAR”,   “CLOB”或“TEXT”然后该列具有TEXT亲和力。请注意   type VARCHAR包含字符串“CHAR”,因此分配了TEXT   亲和力。

  4.   
  5. 如果列的声明类型包含字符串“BLOB”或如果否   指定了类型,然后该列具有关联BLOB。

  6.   
  7. 如果列的声明类型包含任何字符串“REAL”,   “FLOA”或“DOUB”然后该列具有REAL亲和力。

  8.   
  9. 否则,亲和力为NUMERIC。

  10.         

    请注意,确定列关联性的规则的顺序是   重要。声明类型为“CHARINT”的列将与两者匹配   规则1和2,但第一个规则优先,因此列   亲和力将是INTEGER。

您应该查看Datatypes In SQLite Version 3