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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
#1

Где в Фрагменте инициализировать доступ к базе? - Программирование Android

22.05.2013, 18:01. Просмотров 1971. Ответов 34
Метки нет (Все метки)

Где в Фрагменте инициализировать доступ к базе?

пробую так в Create:
Java
1
2
dbOpenHelper = new DBHelperSqLite(getActivity());         
database = dbOpenHelper.getReadableDatabase();
а ошибка at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 18:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где в Фрагменте инициализировать доступ к базе? (Программирование Android):

Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити - Программирование Android
Создать активити с двумя фрагментами. В первый фрагмент должен содержать поле ввода, второй текстовое поле. Выводить во втором фрагменте...

Доступ к базе данных - Программирование Android
Здравствуйте. Имеется три активити (MainActivity (основная), Program (программы подготовки) и Speciality (специальности)), база данных...

Доступ к базе данных из разных активити - Программирование Android
В общем-то в теме и вопрос, как получить доступ к базе данных и разных активити? Есть класс работы с базой class DBHelper extends...

Фрагмент во фрагменте - Программирование Android
Добрый день. А возможно ли создание фрагмента состоящего из нескольких фрагментов?

Webview на фрагменте - Программирование Android
Всем привет! Есть проблемка, может кто сталкивался... Есть фрагмент с webview. Меняю размер шрифта в webview, и меняется только размер на...

Потоки в фрагменте не запустить? - Программирование Android
Не могу использовать потоки в фрагменте. использую конструкцию: new Thread() { @Override public void run() { ...code ...

34
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 18:05 #2
покажите полный лог. что это за огрызок?
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 18:48  [ТС] #3
Рассказываю всё подробно.
Хочу вывести данные в List View. Я делаю так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
public class MyFragment2 extends ListFragment {
 
    private static final String TABLE_MY_DB_TOP = "myDBTop";
    private static final String KEY_ID = "id_top";
    private static final String KEY_CATEGORY = "category";
    private static final String KEY_TITLE = "title";
    private static final String CATEGORY_CINEMA = "Cinema";
    public static final String LOG_TAG = "My_LOGER";
 
 
    private ArrayList<String> friends =  new ArrayList<String>();
    private ListView mListView;
    
    int myI;
    
    DBHelperSqLite dbOpenHelper;
    private SQLiteDatabase database;
 
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        ListTopImageAdapter mAdapter = new ListTopImageAdapter(getActivity(),
                friends);
        mListView.setAdapter(mAdapter);
        super.onActivityCreated(savedInstanceState);
 
        }
 
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        View myView = inflater.inflate(R.layout.my_fragment_screen2,
                container, false);
        mListView = (ListView) myView.findViewById(android.R.id.list);
 
        return myView;
 
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
   
    }
    
    //Извлечение элементов из базы данных
        private void fillFreinds() {
            friends = new ArrayList<String>();
            
             dbOpenHelper = new DBHelperSqLite(getActivity());
                database = dbOpenHelper.getReadableDatabase();
              //Все, база открыта!
                
            Cursor friendCursor = database.query(TABLE_MY_DB_TOP,
                                                 new String[] 
                                                 {KEY_ID, KEY_CATEGORY, KEY_TITLE},
                                                 KEY_CATEGORY + "= ?", new String[] {CATEGORY_CINEMA}, null, null
                                                 , KEY_TITLE);
            
            friendCursor.moveToFirst();
            if(!friendCursor.isAfterLast()) {
                do {
                    String name = friendCursor.getString(2);
                    friends.add(name);
                } while (friendCursor.moveToNext());
            }
            friendCursor.close();
        }
    
        
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
 
    }
 
    // при клике на кнопку в первом фрагменте, запускаеться это метод и выполняет метод  fillFreinds();
    // метод для принятия данных из другого фрагмента.
    public void getMyIndex(int myIndex) {
        // index принят
        try {
            myI = myIndex;
            System.out.println("Вот этот мой Index " + myI);
            if (myI == 1) {
               
                    //метод
                 fillFreinds();
                 
                System.out.println("1 fragment ");
 
            } else {
                System.out.println("не получилось :( там 1 нет = ");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("myIndex пришедший равен " + myIndex);
        }
    }
}
но у меня в ListView ничего не выводит, а в лог ошибки:

05-22 14:28:04.687: W/System.err(11325): java.lang.NullPointerException
05-22 14:28:04.687: W/System.err(11325): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
05-22 14:28:04.687: W/System.err(11325): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
05-22 14:28:04.687: W/System.err(11325): at by.soft.my.Fragment2.fillFreinds(MyFragment2.java:662)
05-22 14:28:04.687: W/System.err(11325): at by.soft.my.Fragment2.getMyIndex(MyFragment2.java:703)
05-22 14:28:04.687: W/System.err(11325): at by.soft.my.Fragment1$1.onClick(myFragment1.java:41)
05-22 14:28:04.687: W/System.err(11325): at android.view.View.performClick(View.java:2408)
05-22 14:28:04.687: W/System.err(11325): at android.view.View$PerformClick.run(View.java:8816)
05-22 14:28:04.687: W/System.err(11325): at android.os.Handler.handleCallback(Handler.java:587)
05-22 14:28:04.697: W/System.err(11325): at android.os.Handler.dispatchMessage(Handler.java:92)
05-22 14:28:04.697: W/System.err(11325): at android.os.Looper.loop(Looper.java:123)
05-22 14:28:04.697: W/System.err(11325): at android.app.ActivityThread.main(ActivityThread.java:4627)
05-22 14:28:04.697: W/System.err(11325): at java.lang.reflect.Method.invokeNative(Native Method)
05-22 14:28:04.697: W/System.err(11325): at java.lang.reflect.Method.invoke(Method.java:521)
05-22 14:28:04.697: W/System.err(11325): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-22 14:28:04.697: W/System.err(11325): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-22 14:28:04.697: W/System.err(11325): at dalvik.system.NativeStart.main(Native Method)


если я помещаю это в onCreate:

Java
1
2
3
4
5
dbOpenHelper = new DBHelperSqLite(getActivity());
database = dbOpenHelper.getReadableDatabase();
 
//и запуск метода 
 fillFreinds();
то в ListView всё отображается, но это происходит автоматически. А мне нужно чтобы это происходило по нажатию кнопки.

вот класс SQLiteOpenHelper:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class DBHelperSqLite extends SQLiteOpenHelper {
 
     public static final String LOG_TAG = "my log";
    
    
   public DBHelperSqLite(Context context) {
     // конструктор суперкласса
     super(context, "myDBTop", null, 1);
   }
 
   @Override
   public void onCreate(SQLiteDatabase db_top) {
     Log.d(LOG_TAG, "--- onCreate database ---");
     // создаем таблицу с полями
     db_top.execSQL("create table myDBTop ("
         + "id integer primary key autoincrement," 
         + "id_top text,"
         + "category text,"
         + "title text,"
         + "updated_at text,"
         + "desc text,"
         + "content_count text" + ");");
   }
 
   
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
   }
 }
очень ожидаю помощи.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 18:56 #4
Цитата Сообщение от Stylish2013 Посмотреть сообщение
MyFragment2.java:662
смотрите сюда, у вас там null где-то.
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 19:01  [ТС] #5
В том то и дело, что я не понимаю почему.

это это строчка:

Java
1
2
3
4
5
 Cursor friendCursor = database.query(TABLE_MY_DB_TOP,
                                                 new String[] 
                                                 {KEY_ID, KEY_CATEGORY, KEY_TITLE},
                                                 KEY_CATEGORY + "= ?", new String[] {CATEGORY_CINEMA}, null, null
                                                 , KEY_TITLE);
с контекстом проблемы по моему.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 19:09 #6
ну, подебагайте, посмотрите не null ли database, не null ли context, по тому что вы выложили не понятно когда выполняется данный код, может в этот момент фрагмент еще не добавлен к активити?
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 19:45  [ТС] #7
Цитата Сообщение от Stylish2013 Посмотреть сообщение
Java
1
2
3
4
5
Cursor friendCursor = database.query(TABLE_MY_DB_TOP,
new String[] 
{KEY_ID, KEY_CATEGORY, KEY_TITLE},
KEY_CATEGORY + "= ?", new String[] {CATEGORY_CINEMA}, null, null
, KEY_TITLE);
когда дебажу, на этой строчке срабатывает эксепшен и не понятно, что ему не нравится. Наверное в этом и беда что может в этот момент фрагмент еще не добавлен к активити. А что конкретно проверить, что должно иметь какие значения?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 20:28 #8
Цитата Сообщение от Stylish2013 Посмотреть сообщение
А что конкретно проверить, что должно иметь какие значения?
конкретно в этой строчки в первую очередь проверить database.
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 22:20  [ТС] #9
Пытаюсь продебажить, но дебаг ни в какую ни начинает с моих брекпоинтов стартавать всё какие-то системные классы перебирает... может есть выход?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 22:32 #10
можете в логи выводить инфу...
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 22:52  [ТС] #11
Подебажил - database = null что делать?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
22.05.2013, 23:04 #12
теперь проверьте что возвращает getActivity() при создании хелпера и покажите код в котором вы вызываете getMyIndex. и зачем вы поместили метод который нужен одному фрагменту во второй фрагмент?
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
22.05.2013, 23:27  [ТС] #13
Я всё таки ещё раз продебажил. datbase - не равна null. У getActivity не могу посмотреть что он возвращает. Просто пишет:

FragmentActivity android.support.v4.app.Fragment.getActivity()
Note: This element neither has attached source nor attached Javadoc and hence no Javadoc could be found.

а вот весь класс фрагмента из которого вызывается метод getMyIndex();

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Fragment1 extends Fragment {
 
    public ViewPager mViewPager;
 
    Fragment2 meFragment2 = new Fragment2();
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        View myView = inflater.inflate(R.layout.fragment_screen1,
                container, false);
 
        // переход на другой фрагмент.
        mViewPager = ((MeActivity) getActivity()).getpager();
        
        // Button one
        Button butBigFilms1 = (Button) myView
                .findViewById(R.id.buttonBigFilms1);
        butBigFilms1.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mViewPager.setCurrentItem(1);
 
                // передача аргумента(данных) в фрагмент 2
            meFragment2.getMyIndex(1);
                // index отправлен
                        }
        });
 
                return myView;
    }
 
}
Добавлено через 1 минуту
Цитата Сообщение от V0v1k Посмотреть сообщение
и зачем вы поместили метод который нужен одному фрагменту во второй фрагмент?
я так обрабатываю нажатие кнопки, которая должна в другом фрагменте запустить необходимый метод.
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
23.05.2013, 00:09 #14
Цитата Сообщение от Stylish2013 Посмотреть сообщение
я так обрабатываю нажатие кнопки, которая должна в другом фрагменте запустить необходимый метод.
а зачем его запускать в другом фрагменте?

можете выложить проект?

Добавлено через 2 минуты
и естественно в meFragment2 getActivity() будет возвращать null

Добавлено через 2 минуты
в общем, не понятно зачем вы разместили метод в другом фрагменте и зачем создаете фрагмент который не используете...
0
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
23.05.2013, 00:17  [ТС] #15
У меня ситуация такая:

Я запускаю фрагмент номер 1 и он содержит 4 кнопки: 1 but, 2 but, 3 but, 4 but. По нажатию на первую кнопку(1 but) я хочу в фрагменте номер 2 в листвью вывести данные о машинах (к примеру), по нажатию кнопки(2 but) я хочу вывести в фрагменте номер 2 в листвью данные о мотоциклах (к примеру) и так далее. Т.е. чтобы в первом фрагменте нажал, а во втором они отображались.

Добавлено через 1 минуту
Цитата Сообщение от V0v1k Посмотреть сообщение
можете выложить проект?
проект сложно выложить так как к нему подключены разные библиотеки и они висят в других проектах, приложение окажется неработоспособным.
0
23.05.2013, 00:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 00:17
Привет! Вот еще темы с ответами:

MenuItemSelected не работает в фрагменте - Программирование Android
Метод return super.onMenuItemSelected(featureId, item); никак не хочет работать в фрагменте, почему? До работы приложения остаётся только...

Остановить выполнение во фрагменте - Программирование Android
Есть для примера код который расположен в фрагменте. как остановить программу // Если номер введен неверно ...

Отображение ListView во фрагменте - Программирование Android
Привет, всем! Буду очень признательна, если кто-нибудь сможет мне помочь разобраться. Я пишу программку для расписания занятий моего...

Обработка физической кнопки в фрагменте - Программирование Android
День добрый! Столкнулся с такой проблемой. Есть фрагмент: package com.example.navigationsample; import java.io.IOException; ...


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

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

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