Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中执行sqlite查询后无法从游标中提取整数_Android_Database_Sqlite_Cursors - Fatal编程技术网

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

在Android中执行sqlite查询后无法从游标中提取整数,android,database,sqlite,cursors,Android,Database,Sqlite,Cursors,我正在开发一个小的android应用程序,它维护一个小的工具数据库,我把这些工具借给别人 作为应用程序的一部分,我合并了一个sqllite数据库,在执行查询和在执行查询后使用游标时遇到了一些问题 有关守则如下: String COLUMN_NAME = "toolName"; String[] columns = { COLUMN_NAME }; String selection = COLUMN_NAME + " =?"; String[] selectionA

我正在开发一个小的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";
    }
}
数据库合同如下:

    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";
    }
}
我实际上是在尝试从列_用法中提取值,这似乎在将值解析为整数时产生了错误。该列中的值实际上是一个整数,类型为前一段代码中的字符串,因此我相当确定上面的代码片段包含了该错误

再次感谢您的帮助

有关守则如下:

net SQL语句类似于:

SELECT toolName FROM tooltable WHERE toolName = ?
并且没有索引为3的列,因为您只返回1列

您需要:

在列列表列中包含usageTime 将光标移动到有效行,因为它最初位于第一行之前 传递getInteger与列对齐的值以检索usageTime
您可以使用以下命令。这将使用null而不是columns,这将获取所有列,即解析为从表中选择*。它检查是否返回了一行,然后才尝试获取数据。它也会关闭光标。使用完光标后,您应该关闭光标。它使用cursor.getInt获取整数值,而不是将整数值从字符串转换为int。它假设您只获取1行,如果没有行,则返回0

注意!我没有检查这个,只是根据记忆编码,所以为这个奇怪的错误道歉

要使用特定列执行上述操作,您可以使用:-

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

从数据库中读取单个值的最简单方法是使用允许您避免处理游标对象的:

字符串查询=从tooltable中选择usageTime,其中toolName=?; 字符串[]selectionArgs={tool}; long returnvalue=DatabaseUtils.longForQuerymToolDb,query,selectionArgs;
您好,非常感谢您的回复。因此,根据我有限的理解,我应该修改列[],以便只显示usageTime,因为这是我实际需要的列。就将光标移动到有效行而言,database.query函数是否已经完成了此操作?@GoatHerder否,当您获得光标时,它将位于第一行之前。这是因为不包含行的游标作为游标是有效的。对!好的,所以基本上我在查询之后,我必须将它下移到第一行,然后才能调用getInteger或其他任何东西。“我说的对吗?”牧羊人,是的,我已经添加了一个答案,说明如何做到这一点。