我正在开发一个小型Android应用程序,该应用程序维护着一个小型工具数据库,我将其借给其他人。
作为应用程序的一部分,我正在合并一个sqllite数据库,一旦执行查询,我就在其中执行查询和使用游标时遇到了一些麻烦。
有问题的代码如下:
String COLUMN_NAME = "toolName";
String[] columns = { COLUMN_NAME };
String selection = COLUMN_NAME + " =?";
String[] selectionArgs = {tool};
Cursor cursor = mToolDb.query(ToolStatisticContract.ToolStatisticEntry.TABLE_NAME, columns,
selection, selectionArgs, null, null, null, null);
return Integer.parseInt(cursor.getString(3));
数据库的协定如下:
public class ToolStatisticContract {
public static final class ToolStatisticEntry implements BaseColumns {
public static final String TABLE_NAME = "tooltable";
public static final String COLUMN_TOOL_NAME = "toolName";
public static final String COLUMN_LIFESPAN = "lifespan";
public static final String COLUMN_USAGE = "usageTime";
}
}
我本质上是试图从COLUMN_USAGE中提取出值,这似乎在将值解析为整数方面产生了错误。COLUMN 中的值实际上是一个整数类型转换为来自前一段代码的字符串,因此我相当确定上面的代码片段包含该错误。
再次提前感谢您的所有帮助!
有问题的代码如下
net SQL 语句类似于:
SELECT toolName FROM tooltable WHERE toolName = ?
并且没有索引为 3 的列,因为您只返回 1 列。
您需要:
- 列列表中有
usageTime
(COLUMNS
( - 将
Cursor
移动到有效行(因为它最初位于第一行之前( getInteger()
传递与COLUMNS
对齐的值以检索usageTime
您可以使用以下内容。这使用null
而不是列,这将获取所有列(即解析为SELECT * FROM table
(。它检查是否已返回一行,然后才尝试获取数据。它还会关闭光标(完成后应关闭光标(。它使用cursor.getInt()
来获取整数值,而不是将其从字符串转换为 int。它假设您只会得到 1 行(如果没有行,则将返回 0(。
int returnvalue = 0;
String COLUMN_NAME = "toolName";
String[] columns = { COLUMN_NAME };
String selection = COLUMN_NAME + " =?";
String[] selectionArgs = {tool};
Cursor cursor = mToolDb.query(ToolStatisticContract.ToolStatisticEntry.TABLE_NAME, null,
selection, selectionArgs, null, null, null, null);
if (cursor.getCount() > 0) {
cursor.moveToFirst();
returnvalue = cursor.getInt(2);
//or returnvalue = Integer.parseInt(cursor.getString(2));
}
cursor.close();
return returnvalue;
注意!我没有检查过这个只是从内存中编码它,所以对这个奇怪的错误表示歉意。
要使用特定列执行上述操作,您可以使用:-
String COLUMN_NAME = "toolName";
String[] columns = { COLUMN_USAGE };
String selection = COLUMN_NAME + " =?";
String[] selectionArgs = {tool};
Cursor cursor = mToolDb.query(ToolStatisticContract.ToolStatisticEntry.TABLE_NAME, columns,
selection, selectionArgs, null, null, null, null);
在这种情况下,列索引将为 0(即索引根据游标中的列(。但是,使用起来可能更好,以下内容根据列的名称获取列索引:-
cursor.getInt(cursor.getColumnIndex(COLUMN_USAGE);
从数据库中读取单个值的最简单方法是使用帮助程序函数,该函数允许您避免处理游标对象:
String query = "SELECT usageTime FROM tooltable WHERE toolName = ?";
String[] selectionArgs = { tool };
long returnvalue = DatabaseUtils.longForQuery(mToolDb, query, selectionArgs);