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

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

Войти
Регистрация
Восстановить пароль
 
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
#1

Чтение данных БД - Программирование Android

10.11.2014, 09:28. Просмотров 787. Ответов 9
Метки нет (Все метки)

Доброго времени суток!
2 вопроса:

1 - Что эффективнее использовать? - JDBC драйвер, подключение к MySql и далее чтение данных или же..
2 - Набор скриптов PHP и парсить JSON?

А теперь о главном.
Я подключаюсь к БД MySql используя JDBC и далее не пойму как мне вывести мой ответ в ListView.
Почитал примеры, особо не понял как происходит процесс в общем.
Я имею ввиду - послал запрос, получил ответ, далее цикл, читаю построчно и куда? и как? Далее не понятно...
Вот код..

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
package com.example.Switcher;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Switch;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class SwitcherActivity extends Activity{
 
    САМ ЛИСТ
    ListView lv; 
    
    private static final String url = "jdbc:mysql://176.57.209.137/aplus_test";
    private static final String user = "aplus_test";
    private static final String pass = "ntcn";
 
    @Override //Конструктор
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
НАШЕЛ ЛИСТ И ВОПРОС ВАЖНО ЛИ ГДЕ ЕГО ОПРЕДЕЛЯТЬ??? В КОНСТРУКТОРЕ ИЛИ НЕТ?
       lv = (ListView) findViewById(R.id.listView); 
        
        Connect();
        sw_one.setOnCheckedChangeListener(this);
    }
 
Подключаюсь к БД
    public void Connect() {
        ConnectMySql task = new ConnectMySql();
        task.execute();
    }
 
    private class ConnectMySql extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls)
        {
            String response = "";
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result = "Database connection success\n";
                Statement st = con.createStatement();
                String query = "SELECT * FROM ap_users";
                //query = query +"'" +variable+"'";
ОТВЕТ
                ResultSet rs = st.executeQuery(query);
                int i = 0;
ЧИТАЮ ПОСТРОЧНО СТОЛБЕЦ username и что дальше????
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username"); 
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return response;
        }
 
        @Override
        protected void onPostExecute(String result) {
 
        }
    }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2014, 09:28     Чтение данных БД
Посмотрите здесь:

TableLayout - чтение данных из строк, изменение данных в строках - Программирование Android
Заполнить TableLayout довольно просто. А вот прочитать ... И примеры есть в интернете, и клипса не ругается, и методы эти существуют...

Чтение данных из файла - Программирование Android
Пытаюсь считать текст из файла, который находится по пути assets\teams\realmadrid.txt , но вываливается ошибка. В чем дело? ...

Чтение данных из бд в listview - Программирование Android
Здесь listview с контекстным меню. В меню 2 пункта. По клику на пункт, запись из listview'a должна добавляться в определенную таблицу. ...

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

Чтение из файла (отображение и изменение данных) - Программирование Android
Есть текстовый файл следующего содержания: Volume=0 Mic=1 .....=0 .....=1 .....=2 Нужно прочитать параметры из файла и...

Чтение и запись данных в локальную БД SQLite - Программирование Android
Есть вот такой класс для работы локальной работы с БД. package com.tanatix.checkinternetresourceschanges; import...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
10.11.2014, 09:57     Чтение данных БД #2
KorPaEv,
Цитата Сообщение от KorPaEv Посмотреть сообщение
2 - Набор скриптов PHP и парсить JSON?
Именно так. Прямое подключение через драйвер не безопасно.
Цитата Сообщение от KorPaEv Посмотреть сообщение
@Override //Конструктор public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); НАШЕЛ ЛИСТ И ВОПРОС ВАЖНО ЛИ ГДЕ ЕГО ОПРЕДЕЛЯТЬ??? В КОНСТРУКТОРЕ ИЛИ НЕТ? lv = (ListView) findViewById(R.id.listView); Connect(); sw_one.setOnCheckedChangeListener(this); }
Кто Вам сказал что это конструктор? Правильно Вы его определяете, в onCreate.

Цитата Сообщение от KorPaEv Посмотреть сообщение
ЧИТАЮ ПОСТРОЧНО СТОЛБЕЦ username и что дальше???? while (rs.next()) { //retrieve data String data = rs.getString("username"); }
Это зависит от того, что Вам надо сделать. Видимо, заполнить лист. Но у Вас нет адаптера.
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
10.11.2014, 10:20  [ТС]     Чтение данных БД #3
YuraAAA, ну мне так казалось...просто писал раньше на c# и поэтому сделал неверные выводы...
Да, мне надо просто заполнить лист из того что я получил в ответе.
Что значит нет адаптера, поподробнее пожалуйста потому как это мои первые попытки что то писать под андроид
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
10.11.2014, 10:56     Чтение данных БД #4
KorPaEv, долго рассказывать буду, погуглите, миллион ответов найдёте. Вам нужен адаптер для листа.
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
10.11.2014, 13:37  [ТС]     Чтение данных БД #5
YuraAAA, я почитал и понял что сначала мы добавляем в лист данные а затем прикручиваем адаптер, но у меня проблема в одном месте

вот тут я добавляю данные в лист

Java
1
2
3
4
5
 List<String> list = new ArrayList<String>();
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username");
                    list.add(data);
                }
а ниже пытаюсь прикрутить адаптер, но я не пойму какой лэйаут туда прописывать если у меня всего лишь один основной лэйаут на котором висит мой листвью...у меня одна активити..

Java
1
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  ВОТ ТУТ ЧТО??, list);
Добавлено через 1 час 0 минут
YuraAAA, хотя уже разобрался вроде как - в адаптер передается лэйаут...и если у меня лист на основном активити, то я впринципе могу передать лэйаут основного активити, так?

+ еще вопрос...у меня подключение к БД и заполнение массива полученными данными происходит в AsyncTask...
Так вот как мне передать из этого класса сам заполненный лист данных в OnCreate()??

Вот код..

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
package com.example.Switcher;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.*;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
public class SwitcherActivity extends Activity {
 
    
    ListView lv;
 
    private static final String url = "jdbc:mysql://ххххххх/ххххх";
    private static final String user = "хххххх";
    private static final String pass = "ххххх";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        lv = (ListView) findViewById(R.id.listView);
        
 //Вот тут я вызываю подключение, как мне передать в него тот самый лист????
        Connect();
//Тут передаю главный лэйаут это правильно????   R.layout.main и  list который мне надо как то получить из AsyncTask  
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.main, list);
        lv.setAdapter(adapter);
    }
 
    //Метод подключения к БД
    public void Connect() {
        ConnectMySql task = new ConnectMySql();
        task.execute();
    }
 
//Вот тут я возвращаю сам лист, но куда он возвращается?
    private class ConnectMySql extends AsyncTask<List<String>, Void, List<String>> {
        @Override
        protected List<String> doInBackground(List<String>... urls)
        {
            List<String> list = new ArrayList<String>();
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result = "Database connection success\n";
                Statement st = con.createStatement();
                String query = "SELECT * FROM ap_users";
                ResultSet rs = st.executeQuery(query);
 
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username");
                    list.add(data);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
//Вернул лист как его передать в основной запуск?
            return list;
        }
    }
}
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
10.11.2014, 14:13     Чтение данных БД #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
private class ConnectMySql extends AsyncTask<Void, Void, List<String>> {
        @Override
        protected List<String> doInBackground(Void... params)
        {
            List<String> list = new ArrayList<String>();
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result = "Database connection success\n";
                Statement st = con.createStatement();
                String query = "SELECT * FROM ap_users";
                ResultSet rs = st.executeQuery(query);
 
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username");
                    list.add(data);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
 
            return list;
        }
 @Override
  public void onPostExecute(List<String> result) {
       adapter.setData(result);
       adapter.notifyDataSetChanged();
  }
 
}
+ добавляем сюда

Java
1
2
3
4
 private static final String url = "jdbc:mysql://ххххххх/ххххх";
    private static final String user = "хххххх";
    private static final String pass = "ххххх";
ArrayAdapter<String> adapter;
изменяем oncreate

Цитата Сообщение от KorPaEv Посмотреть сообщение
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.main, list);
на
Java
1
adapter = new ArrayAdapter<String>(this, R.layout.main, list);
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
11.11.2014, 08:56  [ТС]     Чтение данных БД #7
YuraAAA, все таки я еще не понимаю некоторых вещей...вот мой код, но есть вопросы.

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
package com.example.Switcher;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.*;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
 
public class SwitcherActivity extends Activity
{
    ListView lv;
//Сам адаптер я определяю тут, потому что OnCreate не знает, что такое adapter если его определить в AsyncTask
    ArrayAdapter<String> adapter;
//Аналогично с листом
    List<String> list;
    private static final String url = "jdbc:mysql://xxxxxx/xxxx";
    private static final String user = "xxx";
    private static final String pass = "xxxx";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        lv = (ListView) findViewById(R.id.listView);
 
       Connect();
       adapter = new ArrayAdapter<String>(this, R.layout.main, list);
       lv.setAdapter(adapter);
    }
 
    public void Connect() {
        ConnectMySql task = new ConnectMySql();
        task.execute();
    }
 
    private class ConnectMySql extends AsyncTask<Void, Void, List<String>> {
 
        @Override
        protected List<String> doInBackground(Void... urls)
        {
            list = new ArrayList<String>();
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result = "Database connection success\n";
                Statement st = con.createStatement();
                String query = "SELECT * FROM ap_users";
                //query = query +"'" +variable+"'";
                ResultSet rs = st.executeQuery(query);
 
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username");
                    list.add(data);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return list;
        }
        @Override
        public void onPostExecute(List<String> result) {
//Вот тут начинает ругаться, говорит, что не может вычислить setData
            adapter.setData(result);
            adapter.notifyDataSetChanged();
        }
    }
}
Так вот вопрос - почему
Java
1
adapter.setData(result);
не знает что делать? И вообще каким образом в PostExec передается наш заполненный лист, есть ли он там вообще?

Добавлено через 2 часа 4 минуты
YuraAAA, сейчас посмотрел, у меня вообще адаптер не содержит метода setData()...поэтому ide ругается
Как мне передать в адаптер тогда тот самый лист?
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
11.11.2014, 11:22     Чтение данных БД #8
KorPaEv, а, да, точно. Используйте addAll

http://developer.android.com/referen...ends%20T%3E%29
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
12.11.2014, 07:07  [ТС]     Чтение данных БД #9
YuraAAA, в том то и дело что я уже доковырялся сам и использую его, но у меня после запуска приложения, все обсыпается вот тут...говорит приложение завершено с ошибкой и ничего не пишет в дебаге..
может я что то тут делаю неправильно после метода Connect()????

вот код AsyncTask
Кликните здесь для просмотра всего текста

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
private class ConnectMySql extends AsyncTask<Void, Void, List<String>> {
 
        @Override
        protected List<String> doInBackground(Void... urls)
        {
            list = new ArrayList<String>();
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection(url, user, pass);
                String result = "Database connection success\n";
                Statement st = con.createStatement();
                String query = "SELECT * FROM ap_users";
                //query = query +"'" +variable+"'";
                ResultSet rs = st.executeQuery(query);
 
                while (rs.next()) {  //retrieve data
                    String data = rs.getString("username");
                    list.add(data);
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return list;
        }
        public void onPostExecute(List<String> result)
        {
            adapter.addAll(result);
            adapter.notifyDataSetChanged();
        }
    }


а вот OnCreate()
Кликните здесь для просмотра всего текста
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
public class SwitcherActivity extends Activity
{
    ListView lv;
    ArrayAdapter<String> adapter;
    List<String> list;
    
    private static final String url = "jdbc:mysql://gfghgfhfghfgh";
    private static final String user = "ghjhj";
    private static final String pass = "ghjgh";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        lv = (ListView) findViewById(R.id.listView);
 
        Connect();
        adapter = new ArrayAdapter<String>(this, R.layout.main, list);
        lv.setAdapter(adapter);
    }
 
    public void Connect() {
        ConnectMySql task = new ConnectMySql();
        task.execute();
    }


Добавлено через 12 минут
YuraAAA, кстати как раз эта строка не отрабатывает

Java
1
 //lv.setAdapter(adapter);
как только до нее доходит на выполнение то на экране устройства появляется - В пирложении произошла ошибка и все..

Добавлено через 5 минут
YuraAAA, и кстати заметил еще такую штуку в отладчике, ставлю точку останова тут

Java
1
adapter = new ArrayAdapter<String>(this, R.layout.main, list);
и у меня при проверке list там 0 объектов внутри, он пустой, мне кажется что проблема как раз в том, что лист не передается в адаптер.
в методе PostExec я не знаю, может там что то, как это проверить? и почему именно тут адаптер содержит пустой лист, когда метод Connect отработал и по идеи лист уже не пустой??

Добавлено через 6 минут
YuraAAA, Поставил точку останова именно внутри onPostExec и отладчик туда вообще не заходит...
Вопрос - нужно ли его вызывать принудительно в методе Connect()?
Как вариант

Java
1
2
3
4
5
6
    public void Connect()
    {
        ConnectMySql task = new ConnectMySql();
        task.execute();
        task.onPostExecute(list);
    }
Добавлено через 18 часов 59 минут
В общем помогите разобраться!
Докапался вот до чего и возникло еще больше вопросов.

1 - Почему, если в OnCreate() у меня написан вызов метода Connect() и после него я уже начинаю определять адаптер и заполнение ListView то метод вообще не отрабатывает?? я поставил точку останова внутри AsyncTask и отладчик туда вообще не заходит если написано вот так

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        lv = (ListView) findViewById(R.id.listView);
 
//Вот тут сразу пытается перейти на  adapter = .... минуя  Connect(); ПОЧЕМУ??
        Connect();
        adapter = new ArrayAdapter<String>(this, R.layout.main, list);
        lv.setAdapter(adapter);
    }


2 - Почему если закоментарить эти строки выше у меня отладчик попадает в Connect() и отрабатывает doInBackground, но при этом вообще никак не заходит в onPostExecute()???? Как передать в этот метод мой заполненный лист и потом передать в адаптер его в OnCreate()???

Java
1
2
 //adapter = new ArrayAdapter<String>(this, R.layout.main, list);
 //lv.setAdapter(adapter);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2014, 06:48     Чтение данных БД
Еще ссылки по теме:

Чтение данных с сервера (TCP клиент) - Программирование Android
Добрый день подскажите как реализовать чтение данных с сервера непрерывным потоком и выводить все в TextView. отправку на сервер...

Подскажите лучший способ хранения данных, чтение/запись файлов - Программирование Android
Добрый день. Пишу тренажер для обучению слов (англ-рус). Слова хранятся в файле .txt в виде &quot;arrow | стрела \n...&quot; Мне необходимо хранить...

Чтение данных из БД - Delphi БД
ИМеются записи в БД Access, как можно считать из каждой строки определённые столбцы и записать их в какой нить компонент, к примеру...

Чтение данных*из*БД - C#
Доброго времени суток ! У меня*стрёмный*вопрос*)) приложение выполняет некоторые действия для этого ему требуется информация из...


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

Или воспользуйтесь поиском по форуму:
KorPaEv
54 / 30 / 4
Регистрация: 08.07.2011
Сообщений: 189
14.11.2014, 06:48  [ТС]     Чтение данных БД #10
Все тему можно закрывать, проблема была в определении адаптера и его параметрах, вот код onPostExecute

Java
1
2
3
4
5
6
7
8
9
 @Override
        protected void onPostExecute(ArrayList<String> result)
        {
            super.onPostExecute(result);
            adapter = new ArrayAdapter (MainActivity.this , android.R.layout.simple_list_item_1, android.R.id.text1, result);
            lv.setAdapter(adapter);
            //adapter.addAll(result);
            //adapter.notifyDataSetChanged();
        }
Yandex
Объявления
14.11.2014, 06:48     Чтение данных БД
Ответ Создать тему
Опции темы

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