Форум программистов, компьютерный форум CyberForum.ru

Инициализация базы данных - Android

Восстановить пароль Регистрация
 
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,064
11.12.2014, 15:39     Инициализация базы данных #1
Есть главная активити + 3 фрагмента. Из фрагментов вызываются AsyncTask и результаты пишутся в DB.
Постоянно вижу в логах ошибки на "close() was never explicitly called".
Вопрос - как лучше инициализировать класс DB:
а) В MainActivity (public static DB db) и обращаться к нему как MainActivity.db
б) В каждом классе.
в) Передавать из MainActivity в другие классы параметрами напр. fragment = new ScreenTable(db);
И как его правильно закрывать и где.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
11.12.2014, 15:51     Инициализация базы данных #2
Rube, Вы где-то используете курсор? Если да, то вызываете close?
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 424
11.12.2014, 15:53     Инициализация базы данных #3
Не напрашиваюсь на мейн стрим. Но я инициализировал в каждом классе, где нужно было. А какие проблемы с закрытием? Насколько я знаю, поработал с курсором, закрыл и всего делов, может что-то с AsyncTask?
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,064
11.12.2014, 16:13  [ТС]     Инициализация базы данных #4
Цитата Сообщение от YuraAAA Посмотреть сообщение
Вы где-то используете курсор?
Да, во фрагментах (implements LoaderCallbacks<Cursor>) для SimpleCursorAdapter. Про close() забыл, точно. Но все равно вопрос остается открытым.
Из AsyncTask вызываю только методы напр. db.addTeam(m.group(1))
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
12.12.2014, 12:01     Инициализация базы данных #5
Не стоит напрямую работать с базой, используйте Content Provider или ORM
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,640
Завершенные тесты: 1
12.12.2014, 12:41     Инициализация базы данных #6
Gabberr, почему? Работает быстрее, запросы гибче.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
12.12.2014, 12:56     Инициализация базы данных #7
Ну во-первых это гораздо удобнее по использованию, во-вторых работа с курсором происходит без вашего участия, а что касается скорости работы, не уверен что она медленнее, в рядовом приложении разница в скорости работы будет совсем не ощутима, если же нужна максимальная скорость, например, при инициализации приложения нужно много данных засунуть в базу, можно это сделать напрямую, с использованием транзакций.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,064
12.12.2014, 14:56  [ТС]     Инициализация базы данных #8
Поставил cursor.close(), при запуске получаю ошибку:
java.lang.IllegalStateException: attempt to re-open an already-closed object
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SamplePagerAdapter extends PagerAdapter {     
    @Override
    public Object instantiateItem(ViewGroup container, int position) {    
        String[] from = new String[] { DB.COLUMN_1 };
        int[] to = new int[] { R.id.txt_1 };
 
        Cursor cursor = MainActivity.db.getAllData();           
        
        scAdapter = new SimpleCursorAdapter(getActivity(), 
                    R.layout.item, cursor, from, to, 0);
 
        View view = getActivity().getLayoutInflater().
                    inflate(R.layout.screen, container, false);
        ListView lv = (ListView) view.findViewById(R.id.lv);
        lv.setAdapter(scAdapter);
        container.addView(lv); 
        cursor.close();
        return lv;          
    }        
}
Во фрагменте используются имплементированные от LoaderCallbacks методы
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
      return new MyCursorLoader(this.getActivity(), MainActivity.db);
    }
 
    static class MyCursorLoader extends CursorLoader {
        DB db;        
        public MyCursorLoader(Context context, DB db) {
          super(context); this.db = db;
        }        
      }    
    
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
      scAdapter.swapCursor(cursor);
    }
т.е. закрывать курсор не надо ведь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2014, 15:04     Инициализация базы данных
Еще ссылки по теме:

Базы данных в андроиде Android
Android Чтение данных из базы
Android Обновление Базы данных
Создание базы данных Android
Загрузка базы данных с SD карты Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
12.12.2014, 15:04     Инициализация базы данных #9
Вы передаёте курсор в адаптер
Java
1
2
  scAdapter = new SimpleCursorAdapter(getActivity(), 
                    R.layout.item, cursor, from, to, 0);
Потом закрываете его, и получается, что адаптер пытается юзать закрытый курсор.
Yandex
Объявления
12.12.2014, 15:04     Инициализация базы данных
Ответ Создать тему
Опции темы

Текущее время: 04:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru