Java SQLite返回的行数为零
所有方法都使用相同的sqliteDatabase对象,并且每个方法在开始时都调用getWritableDatabase。 函数doIt只返回空字符串,并记录行数为零selectColumn1byColumn2行数为零且没有任何异常。我做交易和不做交易,两者都不起作用 我该怎么做才对呢 四月八日更新 我已经做了 使用sqliteDatabase添加finally块。接近 添加光标。在sqliteDatabase之前,必要时关闭。接近 更改光标。将getString 0添加到游标。获取字符串游标。getColumnIndex表_COLUMN1 更改光标的位置。getCount>0以显示是否为游标。第一步Java SQLite返回的行数为零,java,android,sqlite,Java,Android,Sqlite,所有方法都使用相同的sqliteDatabase对象,并且每个方法在开始时都调用getWritableDatabase。 函数doIt只返回空字符串,并记录行数为零selectColumn1byColumn2行数为零且没有任何异常。我做交易和不做交易,两者都不起作用 我该怎么做才对呢 四月八日更新 我已经做了 使用sqliteDatabase添加finally块。接近 添加光标。在sqliteDatabase之前,必要时关闭。接近 更改光标。将getString 0添加到游标。获取字符串游标。g
现在,它返回的行数为零,并且不适用于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 ( );
}
}