0

我很好奇androids SQLiteDatabase insert 方法是否自动处理类型转换。

这是我的例子:

我有一个列名为年龄的 csv 文件。它的类型将是一个整数。

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

现在我正在使用 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 调用时,它看起来更干净,即:

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

干净的

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

丑陋的

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);
4

2 回答 2

1

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

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

参考:

于 2013-06-29T18:01:21.037 回答
1

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

请参阅Type Affinity的文档。

于 2013-06-29T19:21:03.900 回答