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 ( )
在cursor . close ( )
sqliteDatabase . close ( )
将cursor . getString ( 0 )
更改为cursor . getString ( cursor . getColumnIndex ( TABLE_COLUMN1 ) )
将if ( cursor . getCount ( ) > 0 )
更改为if ( cursor . moveToFirst ( ) )
现在它返回行数为零并且不能在Jelly Bean 4.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%确定它是必需的,但值得一试。