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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
#1

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

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

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

Постолбцовое отображение данных из базы данных SQLite - Программирование Android
Уважаемые форумчане, помогите пожалуйста. Необходимо вывести данные из таблицы базы данных в TextView. Вот код, когда в TextView...

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

Вывод данных из базы данных SQLite - Программирование Android
Здравствуйте уважаемые форумчане! Делаю программу для работы с базой данных SQLite. Смысл простой: есть одна база, в ней 9 таблиц, от 2 до...

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

Базы данных в андроиде - Программирование Android
Структура данных примерно такова public class Stat { int id, key_id; List<String> date; List<String> rub_1; ...

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

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

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

Вывод из базы данных - Программирование Android
Хочу вывести список паролей из бд в ListView. package com.example.android_39_sqliteregistrationsys; import android.app.Activity; ...

Шифрование базы данных - Программирование Android
У меня есть база данных. Мне надо ее зашифровать. есть https://guardianproject.info/code/sqlcipher/ все бы круто но меня смущает...

Чтение данных из базы - Программирование Android
Доброго времени суток ув. форумчане! Возникла проблема при попытке прочитать данные из БД, которая сохранена в external storage. Помогите...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.12.2014, 15:04
Ответ Создать тему
Опции темы

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