在Android中执行sqlite查询后,无法从游标中提取整数

时间:2017-07-12 23:56:47

标签: android database sqlite cursors

我正在开发一个小型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中的值实际上是一个整数,类型为前一段代码中的String,所以我很确定错误包含在上面的代码片段中。

再次感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

  

有问题的代码如下

net SQL语句类似于:

private void Form1_Load(object sender, EventArgs e)
{
    listBox1.DrawMode = DrawMode.OwnerDrawFixed;
}

并且没有索引为3的列,因为您只返回1列。

你需要:

  • 列列表中ul { display: flex; justify-content: space-between } SELECT toolName FROM tooltable WHERE toolName = ?
  • usageTime移至有效行(因为它最初位于第一行之前)
  • 将与COLUMNS对齐的值Cursor传递给getInteger()

答案 1 :(得分:0)

您可以使用以下内容。这使用 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);

答案 2 :(得分:0)

从数据库中读取单个值的最简单方法是使用helper function,以避免必须处理游标对象:

String query = "SELECT usageTime FROM tooltable WHERE toolName = ?";
String[] selectionArgs = { tool };
long returnvalue = DatabaseUtils.longForQuery(mToolDb, query, selectionArgs);