Java SQLite返回的行数为零

Java SQLite返回的行数为零,java,android,sqlite,Java,Android,Sqlite,所有方法都使用相同的sqliteDatabase对象,并且每个方法在开始时都调用getWritableDatabase。 函数doIt只返回空字符串,并记录行数为零selectColumn1byColumn2行数为零且没有任何异常。我做交易和不做交易,两者都不起作用 我该怎么做才对呢 四月八日更新 我已经做了 使用sqliteDatabase添加finally块。接近 添加光标。在sqliteDatabase之前,必要时关闭。接近 更改光标。将getString 0添加到游标。获取字符串游标。g

所有方法都使用相同的sqliteDatabase对象,并且每个方法在开始时都调用getWritableDatabase。 函数doIt只返回空字符串,并记录行数为零selectColumn1byColumn2行数为零且没有任何异常。我做交易和不做交易,两者都不起作用 我该怎么做才对呢

四月八日更新

我已经做了

使用sqliteDatabase添加finally块。接近

添加光标。在sqliteDatabase之前,必要时关闭。接近

更改光标。将getString 0添加到游标。获取字符串游标。getColumnIndex表_COLUMN1

更改光标的位置。getCount>0以显示是否为游标。第一步


现在,它返回的行数为零,并且不适用于Jelly Bean 4.2-android应用程序崩溃

更改selectColumn1byColumn2方法如下

   public class SQLiteProvider extends SQLiteOpenHelper {

    private static SQLiteDatabase sqliteDatabase ;  

    public SQLiteProvider ( Context context ) {
        super ( context , DATABASE_NAME , null , DATABASE_VERSION ) ;
    }

    @Override
    public void onCreate ( SQLiteDatabase sqliteDatabase ) {
        try {
            this . sqliteDatabase = this . getWriteabaleDataBase ( ) ;
            this . sqliteDatabase . execSQL ( TABLE_CREATE ) ;
            this . sqliteDatabase . close ( ) ;
        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
    }

    private void insert ( String column1Value , String column2Value ) {
        try {
            sqliteDatabase = this . getWritableDatabase ( ) ;
            sqliteDatabase . execSQL ( QUERY_TO_INSERT ) ;
            sqliteDatabase . close ( ) ;
        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
    }

    private String selectColumn1byColumn2 ( String column2Value ) {
        try {
            sqliteDatabase . getWritableDatabase ( ) ;
            cursor = sqliteDatabase . rawQuery ( SELECT_QUERY ) ;
            sqliteDatabase . close ( )
        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
        if ( cursor . getCount ( ) > 0 ) {
            return cursor . getString ( 0 ) ;
        } else { 
            Log . i ( LOG_TAG , "selectColumn1byColumn2 row count is zero " ) ; 
            return "";
        }
    }

    public String doIt ( ) {
        insert ( VARIABLE1 , VARIABLE2 ) ;
        return selectColumn1byColumn2 ( VARIABLE2 ) ;
    }
}
sqliteDatabase。接近


无法获得所需结果的原因是,首先关闭数据库,然后从光标读取数据

如果您首先从游标中读取数据,并且在使用完游标后关闭数据库,那么它应该可以工作

名为alibi的用户在回答中给出了很好的解释:

1光标只是指向查询返回的数据的指针,它不包含查询中的所有数据。这是为了提高性能/效率,不会立即读取大型结果集->使用更少的内存。因此,如果关闭数据库,光标将无法检索数据->它是空的

2当您关闭光标时,将释放所有关联的资源-> 无法访问与此游标关联的数据,因为它已 已发布,但您可以使用此选项或其他选项进行新查询 光标。关闭数据库时,直到 你打开了

3始终关闭游标。否则您将遇到问题—GC 如果光标未关闭且新查询被阻止,将发出抱怨

4如果您在应用程序完成时关闭它,则是

再一次,不在场证明是可信的

使现代化 cursor.close和sqliteDatabase.close被移动到finally块。这将确保在使用完数据库和游标后,数据库和游标得到正确清理

我还添加了一个cursor.moveToFirst;在第一次调用getCount之前调用


虽然不能100%确定是否需要,但值得一试。

但在android.database.CursorIndexOutOfBoundsException索引-1请求后,我又出现了另一个错误,该索引的大小为32@Sunshine我更新了我的帖子。我不是100%确定,但我相信如果cursor.close和sqliteDatabase.close仍然存在错误,问题可能是您需要调用cursor.moveToFirst;我相信这会初始化实际数据,而不是像列名称游标这样的元数据。第一步;如果是光标。getCount>0{如果游标.moveToFirst{不是吗?我这样做,cursor.close;在finally块中,它写到行计数为零,不抛出任何一个exception@Sunshine删除注释以放置新注释。就android文档而言,文档中没有提到getCount调用moveToFirst。这没有意义,因为如果您循环Troup在循环体中,你需要cursor.getCount进行一些计算?它会创建一个无限循环。这很容易修复,但你明白了。老实说,我不知道getCount是否调用moveToFirst。
 private String selectColumn1byColumn2 ( String column2Value ) {
        try {
            sqliteDatabase . getWritableDatabase ( ) ;
            cursor = sqliteDatabase . rawQuery ( SELECT_QUERY ) ;
             if ( cursor . getCount ( ) > 0 ) {
            return cursor . getString ( 0 ) ;
        } else { 
            Log . i ( LOG_TAG , "selectColumn1byColumn2 row count is zero " ) ; 
            return "";
          }
        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
         finally
        {
          cursor.close();
          sqliteDatabase . close ( );
        }
private String selectColumn1byColumn2 ( String column2Value ) {
    try {
        sqliteDatabase . getWritableDatabase ( ) ;
        cursor = sqliteDatabase . rawQuery ( SELECT_QUERY ) ;

        cursor.moveToFirst();
        if ( cursor . getCount ( ) > 0 ) {
            return cursor . getString ( 0 ) ;
        } else { 
            Log . i ( LOG_TAG , "selectColumn1byColumn2 row count is zero " ) ; 
            return "";
        }
    } catch ( Exception exception ) {
        Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
    } finally {
        cursor.close(); 
        sqliteDatabase . close ( );
    }
}