在安卓中预置 sqlite 查询后无法从游标中提取整数



我正在开发一个小型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);

最新更新