SQLite返回的行数为零

时间:2013-04-05 09:17:38

标签: java android sqlite

   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对象,并且每个方法都在开头调用getWritableDatabase。 函数doIt()只返回空字符串并记录该行计数为零(selectColumn1byColumn2 row count is zero)并且没有一个例外。我用事务做,没有,两者都不起作用 我怎么回事?

4月8日更新

我已经完成了

使用sqliteDatabase . close ( )

添加finally块

cursor . close ( )

之前添加sqliteDatabase . close ( )

cursor . getString ( 0 )更改为cursor . getString ( cursor . getColumnIndex ( TABLE_COLUMN1 ) )

if ( cursor . getCount ( ) > 0 )更改为if ( cursor . moveToFirst ( ) )

现在它返回行数为零并且不能在Jelly Bean 4.2上运行 - 安卓应用程序崩溃

2 个答案:

答案 0 :(得分:1)

将selectColumn1byColumn2()方法更改为folllows

 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 "";
          }
  

sqliteDatabase。关 ( );

        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
         finally
        {
          cursor.close();
          sqliteDatabase . close ( );
        }

答案 1 :(得分:1)

您没有得到所需结果的原因是您先关闭数据库然后从光标读取。

如果您第一次阅读cursur,并且当您使用光标关闭数据库时,它应该可以正常工作。

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

  

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

     

2)关闭光标时,释放所有相关资源 - >   您无法访问与此光标关联的数据(因为它具有   已发布),但您可以使用此或其他方式进行新查询   游标。当您关闭数据库时,您不能再查询它(直到   你重新打开它。)

     

3)始终关闭游标。否则你会遇到问题 - GC   如果光标未关闭且新查询被阻止,则会抱怨。

     

4)如果您在应用完成后关闭它,是的

再次,归功于alibi。

更新

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

cursor.close和sqliteDatabase.close()被移动到finally块。这将确保数据库和光标在使用完毕后能够正确清理。

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

之前调用

不是100%确定它是必需的,但值得一试。