SQLite + Activity

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 13:02

День добрый.
Составил запрос, но к чему его прикреплять чтобы eclipse не ругался?

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

	// получить данные из таблицы DB_TABLE2 c нужным id
	public Cursor getFoodData() {		
		Cursor query = "select * from Food where _id = m_id";
		return query;
		// return mDB.query(DB_TABLE2, null, null, null, null, null, null);
	}

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

Re: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 13:09

почитай урок про запросы, лучше пользоваться оператором rawQuery из урока 37
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: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 13:09

и в заголовке метода пиши public Cursor getFoodData(int id)
R.id.team

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

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 13:48

Спасибо за оперативный ответ, я как раз разбирал rawQuery.
Сейчас выглядят так:

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

public Cursor getFoodData(int id) {		
		String sqlQuery = "select * from Food where _id = ?";
		Cursor cursor = mDB.rawQuery(sqlQuery, new String[] {"num2"});			
		return cursor;		
	}
При нажатии вызываю вторую таблицу

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

Intent Food = new Intent(getApplicationContext(), Food.class);
        startActivity(Food);
В активити Food

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

// обновляем курсор
	void refreshCursor2() {
		stopManagingCursor(cursor2);		
		cursor2 = db.getFoodData(IDM_ACTION);		
		startManagingCursor(cursor2);
	}
Программа запускается, но выборка косячит, вторая таблица отображается пустой. Поле num2 задал в ручную =1, но всё равно результат пустой.

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 14:54

Фэйл с ковычками осознан :)

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

Re: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 15:11

Cursor cursor = mDB.rawQuery(sqlQuery, new String[] {"num2"});
какой еще num2????
R.id.team

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

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 15:45

Если поставить не "num2", а "1", то нормально ищет, получается все с id=1 из второй таблицы отображаются. Я хочу сделать чтобы там было значение поля второй таблицы num2. Которое в свою очередь ставит своё значение в зависимости от нажатого id в первой таблице. Т.е. если перешёл из списка с id=1 (в первой таблице), то поле num2 у всех добавляемых записей принимает значение "1" (у второй таблицы) и отображает только их (поля с num2=1). Я уже запутался со всеми этими id :shock:

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

lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				m_id = id;
				showDialog(IDM_ACTION);
			}
Получается это значение m_id надо вставлять в мой запрос, и им же заполнять строки поля num2.

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

Re: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 17:00

ты запутался потому, что меня не слушаешь.
Переименуй свои поля как я говорила)
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: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 17:01

а это что? m_id = id; ?? :shock: :shock:

и это? IDM_ACTION?
Последний раз редактировалось Foenix 29 июн 2013, 17:08, всего редактировалось 1 раз.
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: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 17:06

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

public Cursor getFoodData(int id) {         
        String sqlQuery = "select * from Food where _id = ?"; 
        Cursor cursor = mDB.rawQuery(sqlQuery, new String[] {"num2"});             
        return cursor;         
    } 
Вот тут у тебя не переменная num2, а строчка "num2"! Просто слово такое)
А когда ты вписываешь в кавычки единичку - оно конечно тебе в цифру 1 преобразовало ))

Там должно быть:
{id});
параметр метода!! отсюдова!!

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

public Cursor getFoodData(int id) {      
Чуточку понятно?
R.id.team

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

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 18:59

ты запутался потому, что меня не слушаешь.
я правда стараюсь)
а это что? m_id = id; ??
это там я так делаю и работаю с m_id

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

Message.title = db.getTitle(m_id);
Message.latitude = db.getLatitude(m_id);
Message.longitude = db.getLongitude(m_id);
и это? IDM_ACTION?
Это контекстное меню при нажатии
Может фигово пояснил, на всякий случай вот код первой активити

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

package com.shop.database;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class ShopActivity extends Activity {

	ListView lvData;
	DB db;
	SimpleCursorAdapter scAdapter;
	Cursor cursor;

	public static ShopActivity m_self;
	public static int remove = 0;
	long m_id = 0;

	private final int IDM_ACTION = 0;
	private final int IDM_EXIT = 1;
	private final int IDM_REMOVE = 2;
	private final int IDM_CRASH = 3;

	final CharSequence[] mActions = { "Редактировать", "Товары", "Удалить", "Отмена" };

	public ShopActivity() {
		m_self = this;
	}

	/** Called when the activity is first created. */
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		// открываем подключение к БД
		db = new DB(this);
		db.open();

		// получаем курсор
		refreshCursor();

		// формируем столбцы сопоставления
		String[] from = new String[] { DB.COLUMN_ID, DB.COLUMN_TITLE,
				DB.COLUMN_LATITUDE, DB.COLUMN_LONGITUDE };
		int[] to = new int[] { R.id.itemID, R.id.itemTitle, R.id.itemlatitude,
				R.id.itemLongitude };

		// создааем адаптер и настраиваем список
		scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from,
				to);
		lvData = (ListView) findViewById(R.id.lvData);
		lvData.setAdapter(scAdapter);

		lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				m_id = id;
				

				showDialog(IDM_ACTION);
			}
		});
	}
	
	void editDate() {
		Intent iMessage = new Intent(getApplicationContext(), Message.class);
		startActivity(iMessage);
		remove = 1;
		Message.title = db.getTitle(m_id);
		Message.latitude = db.getLatitude(m_id);
		Message.longitude = db.getLongitude(m_id);		
	}
	
	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, IDM_CRASH, Menu.NONE, "Закрыть приложение")
                .setIcon(R.drawable.menu_exit);                
        return (super.onCreateOptionsMenu(menu));
    }
	
	@Override
    public boolean onOptionsItemSelected(MenuItem item) {       
        switch (item.getItemId()) {
            case IDM_CRASH: {
            	onBackPressed();
            }
            break;          
        }
        return (super.onOptionsItemSelected(item));
    }
	
	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {

		case IDM_ACTION:
			AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle("Выберите действие");

			builder.setItems(mActions, new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int item) {

					// редактировать
					if (item == 0) {
						editDate();
					}
					
					// товары
					if (item == 1) {
						//m_id						
						Intent Food = new Intent(getApplicationContext(), Food.class);
						startActivity(Food);
					}
					
					// удалить
					if (item == 2) {
						showDialog(IDM_REMOVE);
					}

					// отмена
					if (item == 3) {
						dialog.cancel();
					}
				}
			});

			builder.setCancelable(false);
			return builder.create();
		default:

		case IDM_EXIT:
			AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
			builder1.setMessage("Хотите выйти?");
			builder1.setPositiveButton("Да",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							ShopActivity.this.finish();
						}
					});
			builder1.setNegativeButton("Нет",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							dialog.cancel();
						}
					});
			builder1.setCancelable(false);
			return builder1.create();

		case IDM_REMOVE:
			AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
			builder2.setMessage("Удалить?");
			builder2.setPositiveButton("Да",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							if (m_id != 0)
								m_delRec();
						}
					});
			builder2.setNegativeButton("Нет",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							dialog.cancel();
						}
					});
			builder2.setCancelable(false);
			return builder2.create();

		}
	}

	// обновляем курсор
	void refreshCursor() {
		stopManagingCursor(cursor);
		cursor = db.getAllData();
		startManagingCursor(cursor);
	}

	// обработка нажатия кнопки
	public void onButtonClick_addRec(View view) {

		Intent iMessage = new Intent(this, Message.class);
		startActivity(iMessage);
	}

	public void addReccordToDB(String title, String latitude, String longitude) {
		// удаляем старую запись
		if (m_id != 0)
			m_delRec();

		// добавляем запись
		db.addRec(title, latitude, longitude);
		// обновляем курсор
		refreshCursor();
		// даем адаптеру новый курсор
		scAdapter.changeCursor(cursor);
		m_id = 0;
	}

	void m_delRec() {
		db.delRec(m_id);
		// обновляем курсор
		refreshCursor();
		// даем адаптеру новый курсор
		scAdapter.changeCursor(cursor);
		m_id = 0;
	}

	protected void onDestroy() {
		super.onDestroy();
		// закрываем подключение при выходе
		db.close();
	}

	@Override
	public void onBackPressed() {
		showDialog(IDM_EXIT);
	}

}
Вот тут у тебя не переменная num2, а строчка "num2"! Просто слово такое)
А когда ты вписываешь в кавычки единичку - оно конечно тебе в цифру 1 преобразовало ))
Это я уже понял))
Фэйл с ковычками осознан
Чуточку понятно?
Определённо! :)
Пишу
public Cursor getFoodData(int id) {
String sqlQuery = "select * from Food where _id = ?";
Cursor cursor = mDB.rawQuery(sqlQuery, new String[] { id });
return cursor;
Если я всё правильно понял, то теперь надо как-то перегнать int id в String id. Как на счёт такого?

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

public Cursor getFoodData(int id) {	
		StringBuilder sb = new StringBuilder(); sb.append(""); sb.append(id); String m_id = sb.toString();		
		String sqlQuery = "select * from Food where _id = ?";
		Cursor cursor = mDB.rawQuery(sqlQuery, new String[] { m_id });				
		return cursor;		
	}

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: SQLite + Activity

Сообщение rezak90 » 29 июн 2013, 19:26

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

public Cursor getFoodData(int id) {
        return mDB.query("Food ", null, "_id =?", new String[]{String.valueOf(id)}, null, null, null);
    }
or

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

public Cursor getFoodData(int id) {
        return mDB.rawQuery("SELECT * FROM Food WHERE _id = " + id, null);
    }
R.id.team
Политика на форуме запрещена

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 20:06

Спасибо, работает! :)
Теперь осталось передать нужный id, чтобы работала выборка. Например отсюда?

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

lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				}

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: SQLite + Activity

Сообщение rezak90 » 29 июн 2013, 20:17

Monster писал(а):Спасибо, работает! :)
Теперь осталось передать нужный id, чтобы работала выборка. Например отсюда?

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

lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				}
long id - этот тот id который берётся из базы, вот его и нужно передавать в методы которые вам написали
R.id.team
Политика на форуме запрещена

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 20:44

Имелось ввиду с помощью чего передавать? putExtra?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: SQLite + Activity

Сообщение rezak90 » 29 июн 2013, 20:46

куда передать? в другое активити?
R.id.team
Политика на форуме запрещена

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 20:53

Получается из ShopActivity (первая активити) в class DB (не активити, но другой .java файл). Но ещё надо передать этот id, как значение при переходе на Food (вторая активити), чтобы столбец "num2" был заполнен только этим id.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: SQLite + Activity

Сообщение rezak90 » 29 июн 2013, 21:26

Monster писал(а):Получается из ShopActivity (первая активити) в class DB (не активити, но другой .java файл). Но ещё надо передать этот id, как значение при переходе на Food (вторая активити), чтобы столбец "num2" был заполнен только этим id.
class DB - имея на него ссылку передавайте ему этот айди;
в активити что бы передать всё верно используйте putExtra
R.id.team
Политика на форуме запрещена

Monster
Сообщения: 20
Зарегистрирован: 28 июн 2013, 15:52

Re: SQLite + Activity

Сообщение Monster » 29 июн 2013, 23:38

С классом проделал, а вот с putExtra не получается. Прочитал 28-29 уроки, понимание не пришло... Подскажите пожалуйста.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: SQLite + Activity

Сообщение rezak90 » 29 июн 2013, 23:57

28 урок

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

Intent intent = new Intent(this, SecondActivity.class); 
    intent.putExtra("id", id);
    startActivity(intent);
вытаскиваем

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

long id = getIntent().getLongExtra("id")
R.id.team
Политика на форуме запрещена

Ответить