2017-02-09 3 views
-1

У меня есть следующий код:Как работает курсор SQLite?

public Cursor getListText(String [] cols) { 
    Cursor cursor = null; 

    if(cols != null && cols.length > 0) { 
     openDb(false); 
     cursor = db.query(true, Contract.Text.TABLE_NAME, cols, null, null, null 
       , null, null, null); 

     if(!cursor.moveToFirst()) { 
      cursor = null; 
     } 
     closeDb(); 
    } 

    return cursor; 
} 

Cursor возвращаемый getListText(String [] cols) потребляется SimpleCursorAdapter, чтобы показать ListView.

Если я не призываю к cursor.moveToFirst() Android бросает исключение:

java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 

Почему это произошло? Это правда, что это происходит только тогда, когда я закрыть базу данных closeDb();

Если необходимо я придаю SimpleCursorAdapter реализации:

private void listViewSetup() { 
    this.listView = (ListView) findViewById(R.id.texts); 
    CursorAdapterDto cursorAdapterDto = this.presenter.getListTextNames(); 
    Cursor cursor = cursorAdapterDto.getCursor(); 
    Log.v("Cursor Object", DatabaseUtils.dumpCursorToString(cursor)); 
    String [] contractNames = cursorAdapterDto.getContractNames(); 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.custom_list_item, cursor, 
      new String [] {"title"}, new int[] {R.id.itemTextView} , 2); 

    listView.setAdapter(adapter); 

    if(cursor == null) { 
     Toast.makeText(this, "No hay textos", 
       Toast.LENGTH_LONG).show(); 
    } 
} 

Спасибо за вашу помощь!

EDITED Извините! Я думаю, что я не объяснил вопрос! Я знаю, что мне нужно управлять курсором, прежде чем закрыть базу данных. Я хочу знать, как SimpleCursorAdapter использует курсор. Я имею в виду, если я перейду сначала к курсору и закрою базу данных SimpleCursorAdapter, нарисуйте элементы listView! Но Если я не перехожу к первой и не закрываю базу данных, почему я не могу получить доступ к элементам? Почему содержимое курсора недоступно?

ответ

0

Erik, закрывающая база данных должна быть последней операцией всегда. вы не можете использовать Cursor после закрытия базы данных, если вы делаете исключение.

Другими словами, вы не можете пойти в базу данных и попытаться прочитать строки (который является функцией от курсора), если DB закрыт ...

Более подробное описание вы можете увидеть в этой ссылке , (Android: Cannot perform this operation because the connection pool has been closed)

Надеюсь, это поможет.

1

Когда вы закрываете базу данных, она отпускает курсор. Не закрывайте базу данных, пока не закончите курсор. Если вы используете курсор в действии или фрагменте, как правило, вы можете закрыть его в конце жизненного цикла Activity/Fragment, обычно в onDestroy() или onStop().

Помимо проблем с выпуском курсора, вы также должны использовать одно и то же соединение с базой данных для всех действий с базой данных в этом Activity/Fragment, вместо того, чтобы создавать/закрывать соединение для каждого действия базы данных. Рассмотрите возможность использования database singleton для обработки соединения таким образом.

0

Возможно, вам потребуется позвонить по номеру moveCursorToFirst() в вашу программу. Это может помочь вам here. Я думаю, что если вы не вызываете moveCursorToFirst(), он проверяется в вашем if(), и тогда база данных закрывается, что вызывает ошибку.

Смежные вопросы