插入数据库时​​是否会转换值?

时间:2013-06-29 17:32:35

标签: android database sqlite

我很好奇,如果机器人SQLiteDatabase插入方法自动处理类型转换。

以下是我的例子:

我有一个列名为age的csv文件。它的类型是INTEGER。

假设我已经创建了数据库和表。

现在我使用CSVReader解析csv文件,该文件解析每一行并将每个值插入到String []的索引中。

为了将每行数据插入数据库,我必须使用ContentValue对象,它允许我在其中存储值。

//Parse each line and store in line...

ContentValue values = new ContentValue();
values.put(KEY_AGE, line[1]); // Assume line[1] is the age 

database.insert(table, null, values); 

如果我将年龄值存储为字符串(如上所示),然后将其插入表中,Android是否会在将其插入数据库之前处理转换为INTEGER?

我问这个是因为我试图将一堆表插入到数据库中,当我可以遍历一个数组然后显式地声明每个put调用时,它看起来更清晰,即:

如果有人有任何设计建议,请随时告诉我。

CLEAN

int i = 0;
for(String s : TransitContract.Routes.COLUMN_ARRAY) {
    values.put(s, line[i]);
    i++;
}

UGLY

values.put(TransitContract.Routes.KEY_ROUTE_ID, line[0]);
values.put(TransitContract.Routes.KEY_AGENCY_ID, line[1]);
values.put(TransitContract.Routes.KEY_SHORT_NAME, line[2]);
values.put(TransitContract.Routes.KEY_LONG_NAME, line[3]);
values.put(TransitContract.Routes.KEY_DESCRIPTION, line[4]);
values.put(TransitContract.Routes.KEY_ROUTE_TYPE, Integer.parseInt(line[5]));
values.put(TransitContract.Routes.KEY_URL, line[6]);
values.put(TransitContract.Routes.KEY_COLOR, line[7]);
values.put(TransitContract.Routes.KEY_TEXT_COLOR, line[8]);

return mDatabase.insert(TransitContract.Routes.TABLE_NAME, null, values);

2 个答案:

答案 0 :(得分:1)

如果您的ContentProvider没有限制它(即直接将其传递给SQLiteDatabase.insert()方法),它应该有效。 SQLite对于查询/插入中使用的类型和实际的列类型并不挑剔。

但是,最好在插入之前解析并检查值。否则,您实际上可能会插入一个无法解析为整数的字符串,因此检索该值可能会失败。

<强>参考文献:

答案 1 :(得分:1)

当您将列声明为INTEGER时,如果可能,SQLite会自动将字符串转换为数字。

请参阅Type Affinity的文档。

相关问题