Как вывести resultset в ListView

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 09:59

добрый день!

Подскажите как вывести результат ResultSet в ListView
ResultSet заполняется запросом в AsyncTask. ("select top 10 product, type from table")
есть layout (item.xml), в котором два textview (product и type)

пробую вот так:

Код: Выделить всё

public void onPostExecute(ResultSet result)
        {
						
				
			try {
				rs.beforeFirst();
			} catch (SQLException e1) {
				// TODO Автоматически созданный блок catch
				e1.printStackTrace();
			}
		    // упаковываем данные в понятную для адаптера структуру
		    ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();
		    Log.d(LOG_TAG,"создаем ArrayList");
		    Map<String, String> m;
		    Log.d(LOG_TAG,"создаем MAP");
		    try {
		    	Log.d(LOG_TAG,"eee"); // <-СТРОКА ЕСТЬ В ЛОГЕ
				while (rs.next()){
					Log.d(LOG_TAG,"фф"); // <-СТРОКИ В ЛОГЕ НЕТ
				    //for (int i = 0; i < resulSetSize; i++) {
				      m = new HashMap<String, String>();
				      m.put("product", rs.getString(0));
				      m.put("type", rs.getString(1));
				      Log.d(LOG_TAG,rs.getString(0));
				      data.add(m);
				    //}
				}
			} catch (SQLException e) {
				// TODO Автоматически созданный блок catch
				e.printStackTrace();
			}
			
			String[] from = {"product","type"};
			int[] to = {R.id.tvText1,R.id.tvText2};
			
			// создаем адаптер
		    SimpleAdapter sAdapter = new SimpleAdapter(MainActivity.this, data, R.layout.item, from, to);
			
    
            //adapter = new Array Adapter<String> (MainActivity.this , android.R.layout.simple_list_item_1, result);
            Log.d(LOG_TAG,"Устанавливаем адаптер");
            lv.setAdapter(adapter);
            //adapter.addAll(result);
            //adapter.notifyDataSetChanged();
        }
	}
Ошибка возникает при начале цикла while (rs.next()). Приложение в эмуляторе вылетает (Force close). Подскажите что не так?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 20 янв 2015, 13:19

ну а лог-то где?в нем смотреть надо
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 14:14

Вот Лог, отсортировал только ошибки

01-20 11:12:16.186: E/AndroidRuntime(371): FATAL EXCEPTION: main
01-20 11:12:16.186: E/AndroidRuntime(371): android.os.NetworkOnMainThreadException
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
01-20 11:12:16.186: E/AndroidRuntime(371): at dalvik.system.BlockGuard$WrappedNetworkSystem.write(BlockGuard.java:290)
01-20 11:12:16.186: E/AndroidRuntime(371): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:462)
01-20 11:12:16.186: E/AndroidRuntime(371): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:55)
01-20 11:12:16.186: E/AndroidRuntime(371): at java.io.DataOutputStream.write(DataOutputStream.java:98)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.SharedSocket.sendNetPacket(SharedSocket.java:687)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java:571)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java:519)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.MSCursorResultSet.cursorFetch(MSCursorResultSet.java:714)
01-20 11:12:16.186: E/AndroidRuntime(371): at net.sourceforge.jtds.jdbc.MSCursorResultSet.next(MSCursorResultSet.java:1137)
01-20 11:12:16.186: E/AndroidRuntime(371): at com.example.bd_connect3_asynctask.MainActivity$ConnectMySql.onPostExecute(MainActivity.java:94)
01-20 11:12:16.186: E/AndroidRuntime(371): at com.example.bd_connect3_asynctask.MainActivity$ConnectMySql.onPostExecute(MainActivity.java:1)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.AsyncTask.finish(AsyncTask.java:590)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.AsyncTask.access$600(AsyncTask.java:149)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.os.Looper.loop(Looper.java:132)
01-20 11:12:16.186: E/AndroidRuntime(371): at android.app.ActivityThread.main(ActivityThread.java:4025)
01-20 11:12:16.186: E/AndroidRuntime(371): at java.lang.reflect.Method.invokeNative(Native Method)
01-20 11:12:16.186: E/AndroidRuntime(371): at java.lang.reflect.Method.invoke(Method.java:491)
01-20 11:12:16.186: E/AndroidRuntime(371): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
01-20 11:12:16.186: E/AndroidRuntime(371): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
01-20 11:12:16.186: E/AndroidRuntime(371): at dalvik.system.NativeStart.main(Native Method)

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как вывести resultset в ListView

Сообщение KamiSempai » 20 янв 2015, 14:43

NetworkOnMainThreadException
Гугл знает в чем проблема.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 15:04

гугл подсказал, что нужно добавить permissions android.permission.ACCESS_NETWORK_STATE, но что-то не помогло

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 15:13

кроме того, советуют использовать doInBackground и onPostExecute, но у меня так это использовано, может просто нельзя цикл крутить в onPostExecute?

никто разве не сталкивался с подобной проблемой

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 20 янв 2015, 15:18

NetworkOnMainThreadException
это переводится как доступ к сети в UI потоке запрещен
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 20 янв 2015, 15:20

кроме этого - у тебя совершенно неправильная обработка ошибок, и ошибка вероятно возникает не в приведенном коде. У тебя в резалтсете небось данных нету
Вот тут ты делаешь
try {
rs.beforeFirst();
} catch (SQLException e1) {
// TODO Автоматически созданный блок catch
e1.printStackTrace();
}
и дальше у тебя код идет. это нормально? если у тебя нету в резалтсете строк - то нужно завершать это дело, а не обрабатывать его дальше.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 15:34

код doInBackground:
[syntax=java5]
private class ConnectMySql extends AsyncTask<Void, Void, ResultSet> {
@Override
protected ResultSet doInBackground(Void... params)
{
try
{

try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
}
catch (ClassNotFoundException e) {
Log.d(LOG_TAG, "Ошибка");
Log.d(LOG_TAG, e.getMessage());
}


String username = "...";
String password = "...";
String URL = "....";

Connection con = null;
con = DriverManager.getConnection(URL, username, password);
Log.d(LOG_TAG,"Connection complite");

Statement st = null;
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

rs = st.executeQuery("select top 10 product, type from table1");
Log.d(LOG_TAG,"Выполнили запрос");
}
catch(Exception e)
{
e.printStackTrace();
}

return rs;
}[/syntax]

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 20 янв 2015, 15:37

блин, я уже запарилась за тобой коды редактировать.
Публикуешь код - ставь теги java5

и опять обработка ошибок неправильная.. класс не найден? да пофиг, идем дальше.. ну кто так делает?
щелкай в лог на адрес ошибки и поймешь где она.
ссылки в подписи.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 15:52

Foenix писал(а):блин, я уже запарилась за тобой коды редактировать.
Публикуешь код - ставь теги java5

и опять обработка ошибок неправильная.. класс не найден? да пофиг, идем дальше.. ну кто так делает?
щелкай в лог на адрес ошибки и поймешь где она.
ссылки в подписи.
сорри :roll:

а куда надо щелкнуть? у меня что-то все поля некликабельны )
лог смотрю на вкладе LogCat

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 20 янв 2015, 16:08

потом я не претендую на роль супер спеца по java, я учусь. если поможете советом буду признателен )

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 20 янв 2015, 16:09

я тебе уже посоветовала, перечитай еще раз.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 21 янв 2015, 10:49

Foenix писал(а):я тебе уже посоветовала, перечитай еще раз.
Все равно не могу понять, проверил еще раз ResultSet в doInBackground не пустой (вывожу строки из запроса в лог), но при попытке обратиться к ResultSet в onPostExecute вылетает Force Close

код:

Код: Выделить всё

protected void onPostExecute(ResultSet result) {

			Log.d(LOG_TAG, "onPostExecute");
			
			try {
				result.first();
			} catch (SQLException e1) {
				// TODO Автоматически созданный блок catch
				Log.d(LOG_TAG, e1.getMessage());
			}
}
ResultSet описывается в doInBackground

Код: Выделить всё

ResultSet rs = null;
...........
return rs;
вот фрагмент лога:

01-21 07:54:22.841: D/dalvikvm(378): GC_CONCURRENT freed 234K, 6% free 7604K/8007K, paused 4ms+2ms
01-21 07:54:23.071: D/myLogs(378): Connection complite
01-21 07:54:23.093: D/myLogs(378): Выполнили запрос
01-21 07:54:23.111: D/myLogs(378): 1211-3211-2000-000-8011
01-21 07:54:23.111: D/myLogs(378): 1211-3231-1000-000-8011
01-21 07:54:23.111: D/myLogs(378): 1211-3232-1000-000-8011
01-21 07:54:23.111: D/myLogs(378): 1211-3231-1000-000-8021
01-21 07:54:23.111: D/myLogs(378): 9.41.4000-0_ТУ
01-21 07:54:23.111: D/myLogs(378): 1211-3211-1610-000-8021
01-21 07:54:23.111: D/myLogs(378): 1211-3211-1620-000-8021
01-21 07:54:23.121: D/myLogs(378): 1211-3200-0000-000-0000_ТУ
01-21 07:54:23.121: D/myLogs(378): 1211-3211-2000-000-8011/8021
01-21 07:54:23.121: D/myLogs(378): 1211-3221-1000-000-8011М
01-21 07:54:23.131: D/myLogs(378): onPostExecute
01-21 07:54:23.131: D/AndroidRuntime(378): Shutting down VM
01-21 07:54:23.131: W/dalvikvm(378): threadid=1: thread exiting with uncaught exception (group=0x40014760)
01-21 07:54:23.141: E/AndroidRuntime(378): FATAL EXCEPTION: main
01-21 07:54:23.141: E/AndroidRuntime(378): android.os.NetworkOnMainThreadException
01-21 07:54:23.141: E/AndroidRuntime(378): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
01-21 07:54:23.141: E/AndroidRuntime(378): at dalvik.system.BlockGuard$WrappedNetworkSystem.write(BlockGuard.java:290)
01-21 07:54:23.141: E/AndroidRuntime(378): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:462)

Настораживает строка Shutting down VM, что это?
подскажите куда дальше копать?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Как вывести resultset в ListView

Сообщение klblk » 21 янв 2015, 12:00

В вашем случае ResultSet видимо обращается к сети, а onPostExecute выполняется в основном потоке и отсюда ошибка NetworkOnMainThreadException.
Сделайте все операции с ResultSet в методе doInBackground, а в onPostExecute возвращайте что-нибудь нормальное, никак не работающая с сетью.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 21 янв 2015, 12:21

дальше в логе что? оборвал на самом интересном месте.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 21 янв 2015, 12:21

klblk, резалтсет это нормальное, типа курсора по-другому.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 21 янв 2015, 12:29

Foenix писал(а):дальше в логе что? оборвал на самом интересном месте.
весь ЛОГ

01-21 09:26:30.247: D/myLogs(376): Connection complite
01-21 09:26:30.267: D/myLogs(376): Выполнили запрос
01-21 09:26:30.287: D/myLogs(376): 1211-3211-2000-000-8011
01-21 09:26:30.287: D/myLogs(376): 1211-3231-1000-000-8011
01-21 09:26:30.287: D/myLogs(376): 1211-3232-1000-000-8011
01-21 09:26:30.287: D/myLogs(376): 1211-3231-1000-000-8021
01-21 09:26:30.287: D/myLogs(376): 9.41.4000-0_ТУ
01-21 09:26:30.287: D/myLogs(376): 1211-3211-1610-000-8021
01-21 09:26:30.287: D/myLogs(376): 1211-3211-1620-000-8021
01-21 09:26:30.287: D/myLogs(376): 1211-3200-0000-000-0000_ТУ
01-21 09:26:30.287: D/myLogs(376): 1211-3211-2000-000-8011/8021
01-21 09:26:30.297: D/myLogs(376): 1211-3221-1000-000-8011М
01-21 09:26:30.307: D/myLogs(376): onPostExecute
01-21 09:26:30.307: D/AndroidRuntime(376): Shutting down VM
01-21 09:26:30.307: W/dalvikvm(376): threadid=1: thread exiting with uncaught exception (group=0x40014760)
01-21 09:26:30.317: E/AndroidRuntime(376): FATAL EXCEPTION: main
01-21 09:26:30.317: E/AndroidRuntime(376): android.os.NetworkOnMainThreadException
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
01-21 09:26:30.317: E/AndroidRuntime(376): at dalvik.system.BlockGuard$WrappedNetworkSystem.write(BlockGuard.java:290)
01-21 09:26:30.317: E/AndroidRuntime(376): at org.apache.harmony.luni.net.PlainSocketImpl.write(PlainSocketImpl.java:462)
01-21 09:26:30.317: E/AndroidRuntime(376): at org.apache.harmony.luni.net.SocketOutputStream.write(SocketOutputStream.java:55)
01-21 09:26:30.317: E/AndroidRuntime(376): at java.io.DataOutputStream.write(DataOutputStream.java:98)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.SharedSocket.sendNetPacket(SharedSocket.java:687)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.RequestStream.putPacket(RequestStream.java:571)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.RequestStream.flush(RequestStream.java:519)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.TdsCore.executeSQL(TdsCore.java:1052)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.MSCursorResultSet.cursorFetch(MSCursorResultSet.java:714)
01-21 09:26:30.317: E/AndroidRuntime(376): at net.sourceforge.jtds.jdbc.MSCursorResultSet.first(MSCursorResultSet.java:1101)
01-21 09:26:30.317: E/AndroidRuntime(376): at com.example.bd_connect5.MainActivity$ConnectMySql.onPostExecute(MainActivity.java:85)
01-21 09:26:30.317: E/AndroidRuntime(376): at com.example.bd_connect5.MainActivity$ConnectMySql.onPostExecute(MainActivity.java:1)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.AsyncTask.finish(AsyncTask.java:590)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.AsyncTask.access$600(AsyncTask.java:149)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:603)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.Handler.dispatchMessage(Handler.java:99)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.os.Looper.loop(Looper.java:132)
01-21 09:26:30.317: E/AndroidRuntime(376): at android.app.ActivityThread.main(ActivityThread.java:4025)
01-21 09:26:30.317: E/AndroidRuntime(376): at java.lang.reflect.Method.invokeNative(Native Method)
01-21 09:26:30.317: E/AndroidRuntime(376): at java.lang.reflect.Method.invoke(Method.java:491)
01-21 09:26:30.317: E/AndroidRuntime(376): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
01-21 09:26:30.317: E/AndroidRuntime(376): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
01-21 09:26:30.317: E/AndroidRuntime(376): at dalvik.system.NativeStart.main(Native Method)

может у меня onPostExecute не дожидается завершения doInBackground, может в этом беда? (уже даже не знаю что подумать)

nikomp
Сообщения: 68
Зарегистрирован: 08 дек 2014, 17:03

Re: Как вывести resultset в ListView

Сообщение nikomp » 21 янв 2015, 12:33

klblk писал(а):В вашем случае ResultSet видимо обращается к сети, а onPostExecute выполняется в основном потоке и отсюда ошибка NetworkOnMainThreadException.
Сделайте все операции с ResultSet в методе doInBackground, а в onPostExecute возвращайте что-нибудь нормальное, никак не работающая с сетью.
с сетью я вообще не планировал работать, нужно просто получить результат sql запроса, несколько полей и вывести в listview

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Как вывести resultset в ListView

Сообщение Foenix » 21 янв 2015, 12:33

at com.example.bd_connect5.MainActivity$ConnectMySql.onPostExecute(MainActivity.java:85)

сюда щелкни два раза, какую строку выдает точно
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить