解决“在终结器中释放语句。请确保在游标上显式调用close()”

时间:2011-07-04 14:14:31

标签: android sqlite

我有两个DB clsses,一个将db文件从资产复制到手机。

第二个是我一直在进行数据库调用的地方,但是在日志中我得到了一个很大的错误,我应该关闭光标。我对此感到困惑,因为我的所有调用都在末尾有一个cursor.close()。

第二个代码:

public class DatabaseTools extends Common {


    private Context context;
    private SQLiteDatabase db;
    private DatabaseHelper dbHelper;
    private Cursor cursor;

    public DatabaseTools(Context context) {
        this.context = context;
        dbHelper = new DatabaseHelper(context);
        db = dbHelper.getWritableDatabase();
    }

    //  MARKS
    public ArrayList<String> getNames(String value) {
                Names = new ArrayList<String>();

                selectStatement = new String[] { DB_COMMON_COL_NAME };
                fromStatement = DB_COMMON_COL_VALUE + " = '" + value + "'";

            cursor = db.query(
                DB_DISTANCE_TABLE_NAME, 
                selectStatement, 
                fromStatement, 
                null, 
                null, 
                null, 
                null);

        int distanceIndex = cursor.getColumnIndex(DB_COMMON_COL_NAME);

        if (cursor.moveToFirst()) {
            do {                
                distanceNames.add(cursor.getString(distanceIndex));

            } while (cursor.moveToNext());
        }
        cursor.close();

        return names;

    }

1 个答案:

答案 0 :(得分:0)

请尝试以下修改以确保关闭光标。您还在构造函数中获取数据库实例。这不好。在使用数据库之前,您应该正确获取数据库实例,并在完成后立即在数据库上调用close()。我建议在getNames(String value)方法中移动db = dbHelper.getWritableDatabase(),而不是在完成后调用db.close() - 也在finally块中。

    public ArrayList<String> getNames(String value) {
            Names = new ArrayList<String>();

            selectStatement = new String[] { DB_COMMON_COL_NAME };
            fromStatement = DB_COMMON_COL_VALUE + " = '" + value + "'";

            cursor = db.query(
            DB_DISTANCE_TABLE_NAME, 
            selectStatement, 
            fromStatement, 
            null, null, null, null);

            if (cursor != null && cursor.moveToFirst()) {

              try {
                  int distanceIndex = cursor.getColumnIndexOrThrow(DB_COMMON_COL_NAME);
                  while(cursor.moveToNext()) { 
                     distanceNames.add(cursor.getString(distanceIndex));            
                  }
              } finally { 
                if (!cursor.isClosed()) {
                cursor.close();
              }
            }

        return names;

     }