Адресация «Выпуск инструкции в финализаторе. Убедитесь, что вы явно вызываете close () для вашего курсора» - PullRequest
1 голос
/ 04 июля 2011

У меня есть два класса DB, один копирует файл базы данных из ресурсов на телефон.

Во-вторых, я отправляю вызовы из БД, но в журнале я получаю ужасную ошибку об открытии курсора. Это меня смущает, так как все мои вызовы имеют курсора.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 голосов
/ 01 ноября 2011

Попробуйте следующую модификацию, чтобы закрыть курсор. Также вы получаете экземпляр базы данных в вашем конструкторе. Это не хорошо. Вы должны получить экземпляр базы данных непосредственно перед началом работы с базой данных и вызвать close () для базы данных, как только вы закончите. Я бы предложил переместить db = dbHelper.getWritableDatabase () внутри метода getNames (String value), чем вызывать 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;

     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...