Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
1

Чтение данных БД

10.11.2014, 09:28. Просмотров 921. Ответов 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) {
 
        }
    }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2014, 09:28
Ответы с готовыми решениями:

TableLayout - чтение данных из строк, изменение данных в строках
Заполнить TableLayout довольно просто. А вот прочитать ... И примеры есть в...

Чтение данных из файла
Пытаюсь считать текст из файла, который находится по пути...

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

Чтение данных из бд в listview
Здесь listview с контекстным меню. В меню 2 пункта. По клику на пункт, запись...

Чтение json данных из файла
Ребят, подскажите, пожалуйста.Имеется файл тхт, где хранятся json данные. Как...

9
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 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"); }
Это зависит от того, что Вам надо сделать. Видимо, заполнить лист. Но у Вас нет адаптера.
1
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
10.11.2014, 10:20  [ТС] 3
YuraAAA, ну мне так казалось...просто писал раньше на c# и поэтому сделал неверные выводы...
Да, мне надо просто заполнить лист из того что я получил в ответе.
Что значит нет адаптера, поподробнее пожалуйста потому как это мои первые попытки что то писать под андроид
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
10.11.2014, 10:56 4
KorPaEv, долго рассказывать буду, погуглите, миллион ответов найдёте. Вам нужен адаптер для листа.
0
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
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;
        }
    }
}
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
10.11.2014, 14:13 6
Лучший ответ Сообщение было отмечено KorPaEv как решение

Решение

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);
1
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
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 ругается
Как мне передать в адаптер тогда тот самый лист?
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
11.11.2014, 11:22 8
KorPaEv, а, да, точно. Используйте addAll

http://developer.android.com/referen...ends%20T%3E%29
0
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
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);
0
KorPaEv
57 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 208
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();
        }
0
14.11.2014, 06:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2014, 06:48

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

Чтение и запись данных в локальную БД SQLite
Есть вот такой класс для работы локальной работы с БД. package...

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


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

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

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