-1
   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日更新

我已经做好了

添加 finally 块sqliteDatabase . close ( )

必要时添加cursor . close ( )之前sqliteDatabase . close ( )

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

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

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

4

2 回答 2

1

更改您的 selectColumn1byColumn2() 方法如下

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

sqlite 数据库。关 ( );

        } catch ( Exception exception ) {
            Log . i ( LOG_TAG , "Exception is `" + exception . toString ( ) + "`" ) ;
        }
         finally
        {
          cursor.close();
          sqliteDatabase . close ( );
        }
于 2013-04-05T09:24:39.090 回答
1

你没有得到想要的结果的原因是因为你先关闭数据库然后从游标中读取。

如果您首先从 cursur 读取,并且当您使用完游标关闭数据库时,它应该可以工作。

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

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

2) 当你关闭一个游标时,所有关联的资源都被释放->你不能访问与这个游标关联的数据(因为它已经被释放了),但是你可以使用这个游标或其他游标进行新的查询。当你关闭一个数据库时,你不能再查询它(直到你重新打开它)。

3) 始终关闭游标。否则你会遇到问题——如果游标没有关闭并且新的查询被阻止,GC 会抱怨。

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

再次,功劳归于不在场证明。

更新

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% 肯定需要它,但值得一试。

于 2013-04-05T15:00:38.577 回答