Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
#1

Инициализация базы данных - Программирование Android

11.12.2014, 15:39. Просмотров 627. Ответов 8
Метки нет (Все метки)

Есть главная активити + 3 фрагмента. Из фрагментов вызываются AsyncTask и результаты пишутся в DB.
Постоянно вижу в логах ошибки на "close() was never explicitly called".
Вопрос - как лучше инициализировать класс DB:
а) В MainActivity (public static DB db) и обращаться к нему как MainActivity.db
б) В каждом классе.
в) Передавать из MainActivity в другие классы параметрами напр. fragment = new ScreenTable(db);
И как его правильно закрывать и где.
http://www.cyberforum.ru/android-dev/thread789533.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2014, 15:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Инициализация базы данных (Программирование Android):

Android - Вывод данных из базы данных
Всем здравствуйте! Задача не сложная, надо просто знать:-[ Нужно вывести данные...

Вывод данных из базы данных SQLite
Здравствуйте уважаемые форумчане! Делаю программу для работы с базой данных...

Вывод из базы данных
Хочу вывести список паролей из бд в ListView. package...

Вывод из базы данных
Допустим у меня есть приложение, с привязанной к нему БД на SQLite, нужно...

Шифрование базы данных
У меня есть база данных. Мне надо ее зашифровать. есть...

8
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
11.12.2014, 15:51 #2
Rube, Вы где-то используете курсор? Если да, то вызываете close?
0
DemD10
58 / 47 / 12
Регистрация: 03.09.2013
Сообщений: 443
11.12.2014, 15:53 #3
Не напрашиваюсь на мейн стрим. Но я инициализировал в каждом классе, где нужно было. А какие проблемы с закрытием? Насколько я знаю, поработал с курсором, закрыл и всего делов, может что-то с AsyncTask?
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
11.12.2014, 16:13  [ТС] #4
Цитата Сообщение от YuraAAA Посмотреть сообщение
Вы где-то используете курсор?
Да, во фрагментах (implements LoaderCallbacks<Cursor>) для SimpleCursorAdapter. Про close() забыл, точно. Но все равно вопрос остается открытым.
Из AsyncTask вызываю только методы напр. db.addTeam(m.group(1))
0
Gabberr
103 / 103 / 19
Регистрация: 13.10.2009
Сообщений: 404
12.12.2014, 12:01 #5
Не стоит напрямую работать с базой, используйте Content Provider или ORM
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
12.12.2014, 12:41 #6
Gabberr, почему? Работает быстрее, запросы гибче.
0
Gabberr
103 / 103 / 19
Регистрация: 13.10.2009
Сообщений: 404
12.12.2014, 12:56 #7
Ну во-первых это гораздо удобнее по использованию, во-вторых работа с курсором происходит без вашего участия, а что касается скорости работы, не уверен что она медленнее, в рядовом приложении разница в скорости работы будет совсем не ощутима, если же нужна максимальная скорость, например, при инициализации приложения нужно много данных засунуть в базу, можно это сделать напрямую, с использованием транзакций.
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
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);
    }
т.е. закрывать курсор не надо ведь?
0
Gabberr
103 / 103 / 19
Регистрация: 13.10.2009
Сообщений: 404
12.12.2014, 15:04 #9
Вы передаёте курсор в адаптер
Java
1
2
  scAdapter = new SimpleCursorAdapter(getActivity(), 
                    R.layout.item, cursor, from, to, 0);
Потом закрываете его, и получается, что адаптер пытается юзать закрытый курсор.
1
12.12.2014, 15:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2014, 15:04
Привет! Вот еще темы с решениями:

Обновление Базы данных
Есть база данных которую просматриваю в Активити1, сделал все работает. При...

Чтение данных из базы
Доброго времени суток ув. форумчане! Возникла проблема при попытке прочитать...

Создание базы данных
Всем доброго времени суток. Пробую писать программу для Android. Сейчас изучаю...

Базы данных в андроиде
Структура данных примерно такова public class Stat { int id, key_id;...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru