Урок 52. SimpleCursorAdapter, пример использования

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 16:41

слушай, ну сделай ты нормаьлный запрос через "select * from table left outer join " и так далее. Сложно понять что там у тебя происходит. Как ты вообще выводишь это в лог..? и главное зачем. Оттестируй запрос в редакторе, потом полностью скопируй его в прогармму, но не через эту штуки, а нормально через rawQuery
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: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 16:47

Я вот так пишу для отладки

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

String strQ="select top(1) *** from *** where *** order by *** desc";
		Log.d("***","strq= "+ strQ);
		Cursor  c = this.mDb.rawQuery(strQ, null);
		if (c != null) {
			c.moveToFirst();
			return c.getInt(c.getColumnIndex("***"));
		}else{
			return 0;
		}
Т.е. у меня в отладку идет весь запрос! Если в нем ошибка, я просто из лога копирую запрос в редактор и проверяю что там не так.
R.id.team

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

sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 28 фев 2013, 16:53

Давайте я Вам сброшу сам проект, а вы посмотрите?
Куда можно отправить?

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 17:01

сорри, совершенно нет на такие действия времени..
пиши сюда то, что я подсказала, проверь то, что я подсказала. По raw query тоже урок есть. Там же все намного проще, чем ты сделал.
Давай выложи скрипты создания таблиц. Стопудово у тебя неправильные там поля стоят, нельзя так две таблицы связывать по id.
Потихоньку во всем разберешься.
R.id.team

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

sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 28 фев 2013, 17:20

вот скрипты создания таблиц.

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

	// имя таблицы Журнала Заказов, поля и запрос создания
	private static final String JURNAL_NAKLADHYH_TABLE = "JURNAL_NAKLADHYH";
	public static final String JURNAL_NAKLADHYH_COLUMN_ID = "_id";
	public static final String JURNAL_NAKLADHYH_COLUMN_ID_NEW_OLD = "_id_New_Old";
	public static final String JURNAL_NAKLADHYH_COLUMN_ID_JURNAL_NAKLADHYH = "_idJURNAL_NAKLADHYH";
	public static final String JURNAL_NAKLADHYH_COLUMN_NAME = "name";
	public static final String JURNAL_NAKLADHYH_COLUMN_IDKLIENT = "_idKlient";
	public static final String JURNAL_NAKLADHYH_COLUMN_NOMERZAKAZA = "NomerZakaza";
	public static final String JURNAL_NAKLADHYH_COLUMN_SUMMA = "Summa";
	public static final String JURNAL_NAKLADHYH_COLUMN_DATA = "Data";
	public static final String JURNAL_NAKLADHYH_COLUMN_TIME = "Time";
	public static final String JURNAL_NAKLADHYH_COLUMN_GPS_SHIROTA = "GPS_Shirota";
	public static final String JURNAL_NAKLADHYH_COLUMN_GPS_DOLGOTA = "GPS_Dolgota";
	private static final String JURNAL_NAKLADHYH_TABLE_CREATE = "create table " + JURNAL_NAKLADHYH_TABLE
			+ "(" + JURNAL_NAKLADHYH_COLUMN_ID + " integer primary key ASC AUTOINCREMENT, " 
			+ JURNAL_NAKLADHYH_COLUMN_ID_JURNAL_NAKLADHYH+ " integer, " 
			+ JURNAL_NAKLADHYH_COLUMN_ID_NEW_OLD+ " integer, " 
			//+ JURNAL_NAKLADHYH_COLUMN_ID_JURNAL_NAKLADHYH+ " integer, " 
			+ JURNAL_NAKLADHYH_COLUMN_NAME+ " text, " 
			+ JURNAL_NAKLADHYH_COLUMN_IDKLIENT+ " integer, " 
			+ JURNAL_NAKLADHYH_COLUMN_NOMERZAKAZA+ " integer, " 
			+ JURNAL_NAKLADHYH_COLUMN_SUMMA+ " real, " 
			+ JURNAL_NAKLADHYH_COLUMN_DATA+ " text, " 
			+ JURNAL_NAKLADHYH_COLUMN_TIME+ " text, " 
			+ JURNAL_NAKLADHYH_COLUMN_GPS_SHIROTA+ " real, "
			+ JURNAL_NAKLADHYH_COLUMN_GPS_DOLGOTA+ " real" 
			+ ");";

	// имя таблицы Накладная, поля и запрос создания
	private static final String NAKLADNAYA_TABLE = "Nakladnaya";
	public static final String NAKLADNAYA_COLUMN_ID = "_id";
	public static final String NAKLADNAYA_COLUMN_ID_NAKLADNAYA = "_idNakladnaya";
	public static final String NAKLADNAYA_COLUMN_ID_TOVAR = "_idTovar";
	public static final String NAKLADNAYA_COLUMN_NAME = "name";
	public static final String NAKLADNAYA_COLUMN_KOLSHTUK = "KolShtuk";
	public static final String NAKLADNAYA_COLUMN_KOLUPAK = "KolUpak";
	public static final String NAKLADNAYA_COLUMN_CENABAZ = "CtnaBaz";
	public static final String NAKLADNAYA_COLUMN_SKIDKA = "Skidka";
	public static final String NAKLADNAYA_COLUMN_CENABEZSKIDKI = "CenaBezSkidki";
	public static final String NAKLADNAYA_COLUMN_SUMMA = "Summa";
	private static final String NAKLADNAYA_TABLE_CREATE = "create table " + NAKLADNAYA_TABLE
			+ "(" + NAKLADNAYA_COLUMN_ID + " integer primary key ASC AUTOINCREMENT, " 
			+ NAKLADNAYA_COLUMN_ID_NAKLADNAYA+ " integer, " 
			+ NAKLADNAYA_COLUMN_ID_TOVAR+ " integer, " 
			+ NAKLADNAYA_COLUMN_NAME+ " text, " 
			+ NAKLADNAYA_COLUMN_KOLSHTUK+ " real, " 
			+ NAKLADNAYA_COLUMN_KOLUPAK+ " real, " 
			+ NAKLADNAYA_COLUMN_CENABAZ+ " real, " 
			+ NAKLADNAYA_COLUMN_SKIDKA+ " real, " 
			+ NAKLADNAYA_COLUMN_CENABEZSKIDKI+ " real, " 
			+ NAKLADNAYA_COLUMN_SUMMA+ " real" 
			+ ");";
Переделал запрос, связываю " String table = "Nakladnaya as NAKLADNAYA inner join JURNAL_NAKLADHYH as JURNAL on NAKLADNAYA._id = JURNAL._idJURNAL_NAKLADHYH";"

вывожу в лог так:

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

	  
..........
startManagingCursor(c);
..........

void logCursor(Cursor c) {
	    if (c != null) {
	      if (c.moveToFirst()) {
	        String str;
	        do {
	          str = "";
	          for (String cn : c.getColumnNames()) {
	            str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
	          }
	          Log.d(LOG_TAG, str);
	        } while (c.moveToNext());
	      }
	    } else
	      Log.d(LOG_TAG, "Cursor is null");
	  }
В лог выводится:"02-28 14:10:22.183: D/myLogs(7588): _id = 2; Name = Продукт №2; Klient = Антипова Лариса ЧП--Ф2; NomerDoc = 2;
"

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 17:50

опять каша у тебя.
Запрос, который ты привел не соответсвует выводимым данным. Полей я вообще не вижу. Это вообще даже не запрос, а кусок какой-то..
Напиши нормальные скрипты таблиц
create table ...
одну и вторую - это на будущее, т.к. тот, кто захочет тебе помочь может проиграть из у себя в сиквел-редакторе ипосмотреь. Еще желательно приводить скрипты добавления данных, чтоб в таблицы хотя бы по паре строчек добавить.

А это что такое означает integer primary key ASC AUTOINCREMENT,
ASC - не знаю даже..

Второе, замени ты inner на left outer join по-человечески.. не прокатит там inner..

Если у тебя ошибки нету,а на экране пустота, то наверняка в курсоре нету данных.
R.id.team

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

sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 28 фев 2013, 18:09

Переделал запрос. Проверил в редакторе, все работает.

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

 String sqlQuery = "select Nakladnaya._id, Nakladnaya.name as Name, JURNAL_NAKLADHYH.name as Klient, JURNAL_NAKLADHYH._idJURNAL_NAKLADHYH as NomerDoc from JURNAL_NAKLADHYH left outer join Nakladnaya on JURNAL_NAKLADHYH._idJURNAL_NAKLADHYH = Nakladnaya._id where JURNAL_NAKLADHYH._idJURNAL_NAKLADHYH =2";
	    c = db.zapros2(sqlQuery);
            logCursor(c); 
На выходе в лог я получаю:

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

02-28 15:00:12.513: D/myLogs(8927): _id = 2; Name = Продукт №2; Klient = Антипова Лариса ЧП--Ф2; NomerDoc = 2; 
Ошибка тут не в запросе.
Я с передачей в адаптер где-то туплю.....
а именно в этой строке:

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

String[] data = new String[] {"Name", "Klient" , "NomerDoc" };
Думаю что нельзя просто указать "Name", а как можно я не знаю....

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 18:19

У меня так в классе на SimpleCursorAdapter

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

@Override
	public void bindView(View view, Context context, Cursor cursor) {
		String sName = cursor.getString(cursor.getColumnIndex(a.ROW_NAME));
		String sAddr = cursor.getString(cursor.getColumnIndex(a.ROW_ADDR));
		
		TextView tvNameFirma = (TextView) view.findViewById(R.id.tvNameFirma);
		TextView tvAddrFirma = (TextView) view.findViewById(R.id.tvAddrFirma);
		
		tvNameFirma.setText(sName);
		tvAddrFirma.setText(sAddr);
	
	}
R.id.team

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

sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 28 фев 2013, 18:33

спасибо, буду разбираться.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 18:47

но я из этой процедуры много чего убрала, т.к. оно мне надо там иметь. Но если ее убрать в простейшем виде у меня все равно список высвечивается норм. А это просто как иная процедура связывания полей курсора и списка. Может там у тебя ошибки повыскакивают более понятные.
R.id.team

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

sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 28 фев 2013, 18:54

Я с андроидом работаю всего неделю.
Мне многое еще не понятно.

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

		String[] data = new String[] { "Name", "Klient", "NomerDoc" };
		int[] to = new int[] { R.id.TxtTovar, R.id.TxtKolShtuk, R.id.TxtSumma };
		// создаем адаптер и настраиваем список
		scAdapter = new SimpleCursorAdapter(this, R.layout.shablonnakladnaya,c, data, to);
		// adapter = new ArrayAdapter<String>(this, R.layout.item,
		// R.id.tvText,data);
		gridNakladnaya = (GridView) findViewById(R.id.gridNakladnaya);
		gridNakladnaya.setAdapter(scAdapter);
		adjustGridView();
.......

	private void adjustGridView() {
		gridNakladnaya.setNumColumns(1);
		gridNakladnaya.setVerticalSpacing(3);
	}
Теперь думаю как Ваш пример прикрутить к своему.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 22:28

я дала кусок класса на основе симпладаптера

а это у вас что такое??
private void adjustGridView() {


gridNakladnaya.setNumColumns(1);


gridNakladnaya.setVerticalSpacing(3);


}
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: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 28 фев 2013, 22:30

а gridview зачем??
если вы всего неделю, делайте как в уроке! ничего не меняйте!
R.id.team

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


sae74
Сообщения: 31
Зарегистрирован: 28 фев 2013, 15:14

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение sae74 » 01 мар 2013, 10:42

От я болван!
Все у меня работало и даже на старом варианте запроса.
Просто сразу же я закрывал курсор cursor.close();
Поэтому и не отображались данные на экране.

Olivka - Большое Вам спасибо за подсказку по оптимизации запроса.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 01 мар 2013, 15:06

Пожалуйста.
Вообще-то я думаю, что грид нужен только в определенных случаях. В основном лучше использовать листвью, кастомизируя его строчки с помощью relative layout, вставляя туда нужные данные. У меня там помещается наименование, под ним меленько допустим адрес, справа сумма, под ней процент и так далее. Так намного приличней смотрится. Например, если нужно по нажатию на строчку что-то определенное запускать или делать.
Имхо грид - это привычка, принесенная с десктопа.
R.id.team

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

Roman
Сообщения: 22
Зарегистрирован: 23 авг 2012, 08:43

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Roman » 06 мар 2013, 19:10

Подскажите, пожалуйста куда бежать где искать если
SimpleCursorAdapter Checkable-производные не воспримет
, а необходимо вывести список из базы данных, и дать возможность юзеру "чекнуть" галочку?
Спасибо за подсказку.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 07 мар 2013, 00:24

Автор, напишите в статье урока, что данный подход устарел. А то это вводит в заблуждение начинающих.
R.id.team

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

Serious
Сообщения: 22
Зарегистрирован: 18 мар 2013, 13:45

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Serious » 18 мар 2013, 14:02

Здравствуйте. Только начинаю осваивать Android. Появился вопрос.
Взял из вашего урока класс DB.java добавил к себе в проект, проблема в том что при попытке работать с ним не из MainActivity.java а из другого класса.
Вылетает exception при попытке открыть подключение к базе.

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

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

	       datamodel.init();
	}
Здесь в MainActivity.java вызываю метод другого класса.

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

public class DataModel extends Activity {

	DB db;

	public void init(){
	    db = new DB(DataModel.this);
	    db.open();
	}
}
И в этом классе пытаюсь открыть подключение к базе. вылетает ошибка

E/AndroidRuntime(23004): FATAL EXCEPTION: main
E/AndroidRuntime(23004): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.sr/ru.sr.MainActivity}: java.lang.NullPointerException
E/AndroidRuntime(23004): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
E/AndroidRuntime(23004): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
E/AndroidRuntime(23004): at android.app.ActivityThread.access$600(ActivityThread.java:122)
E/AndroidRuntime(23004): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
E/AndroidRuntime(23004): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(23004): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(23004): at android.app.ActivityThread.main(ActivityThread.java:4340)
E/AndroidRuntime(23004): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(23004): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(23004): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(23004): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(23004): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(23004): Caused by: java.lang.NullPointerException
E/AndroidRuntime(23004): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
E/AndroidRuntime(23004): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
E/AndroidRuntime(23004): at ru.sr.DB.open(DB.java:60)
E/AndroidRuntime(23004): at ru.sr.DataModel.init(DataModel.java:20)
E/AndroidRuntime(23004): at ru.sr.MainActivity.onCreate(MainActivity.java:31)
E/AndroidRuntime(23004): at android.app.Activity.performCreate(Activity.java:4465)
E/AndroidRuntime(23004): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
E/AndroidRuntime(23004): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)


Заранее спасибо.

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

Re: Урок 52. SimpleCursorAdapter, пример использования

Сообщение Foenix » 18 мар 2013, 14:05

у тебя сразу идет datamodel.init(); А создать?? поэтом у тебя ошибка NullPointerException
R.id.team

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

Ответить