SQLite + Activity

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

SQLite + Activity

Сообщение Monster » 28 июн 2013, 16:01

Привет всем!
Долбаюсь уже пол дня, прошу помочь разобраться.
При создании базы данных использую несколько таблиц и активити, соответственно создаю суперкласс android.app.Activity. Проблема в том, что уже в самих активити при указании xml файла setContentView(R.layout.x1); НО видит .java файл все xml. Т.е. если я создам 1.xml и 2.xml и обращусь R.id.1 или R.id.2 увижу оба. В связи с этим (как я предполагаю) база данных ругается на отсутствие колонок с именем во второй таблице (а если обратиться к колонкам из первой - всё ок).
Надеюсь понятно объяснил :)

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

Re: SQLite + Activity

Сообщение Foenix » 28 июн 2013, 17:24

нет, не понятно - причем тут тогда sqlite?
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 » 28 июн 2013, 17:33

Делаю в одной БД две таблицы. В одной таблице всё ок, потом добавил вторую. В активити к первой таблице пишу
setContentView(R.layout.main);
String[] from = new String[] { DB.COLUMN_1 };
int[] to = new int[] { R.id.1 };
Ко второй таблице
setContentView(R.layout.main2);
String[] from2 = new String[] { DB.COLUMN_2 };
int[] to2 = new int[] { R.id.2 };

Если поставить так
setContentView(R.layout.main2);
String[] from2 = new String[] { DB.COLUMN_1 };
int[] to2 = new int[] { R.id.1 };

Обратиться к первой таблице успешно, хотя по идее не должен, ведь в main2.xml нету R.id.1.

А в общем выскакивает ошибка об отсутствии колонок во второй таблице с указанным мною именем. Сама таблица создаётся норм. В чём проблема?
Я экспериментальным путём решил, что дело с этим непонятным определением, но может и не прав, прошу помочь. Надеюсь теперь понятнее :)

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

Re: SQLite + Activity

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

ТАк у тебя КурсорАдаптер, правильно?
А xml активитей можно сюда? И форматируй, пожалуйста, код. Неудобно разбираться.
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 » 28 июн 2013, 17:52

Если выскакивает ошибка, что нет такой колонки в таблице - то это так и есть. Тут нужно привести лог и код активити.
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 » 28 июн 2013, 17:54

Урок 52 - разберись, там все написано же. У тебя перепутано все.
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 » 28 июн 2013, 18:20

Урок 52 - разберись, там все написано же. У тебя перепутано все.
Глянул, у меня так и написано, может я что-то упускаю? Как так всё перепутано?))

Вот один из xml.

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
		
        <TextView
            android:id="@+id/itemID2"
            android:layout_width="39dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="0dp"
            android:textSize="24sp" />
        
        <TextView
            android:id="@+id/itemNum2"
            android:layout_width="39dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="0dp"
            android:textSize="24sp" />

        <TextView
            android:id="@+id/itemTitle2"
            android:layout_width="70dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="0dp"
            android:layout_weight="0.20"
            android:textSize="24sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/itemBarscn2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_weight="0.53"
            android:textSize="24sp" />
    </LinearLayout>

</LinearLayout>
Если выскакивает ошибка, что нет такой колонки в таблице - то это так и есть. Тут нужно привести лог и код активити.
Я не сомневаюсь в том, что оно думает, но такая колонка есть! :)
Настораживает то, что если попробовать обращаться к колонкам первой таблицы оно это делает, хотя не должно о ней знать.
Код активити для второй таблицы (сейчас я запускаю сразу вторую талицу, поэтому там стоит открыть бд и т.д.)

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

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.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class Food extends Activity {

	ListView lvData2;
	DB db;
	SimpleCursorAdapter scAdapter2;
	Cursor cursor2;

	public static Food m_self2;
	public static int remove2 = 0;
	long m_id2 = 0;

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

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

	public Food() {
		m_self2 = this;
	}

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

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

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

		// формируем столбцы сопоставления
		String[] from2 = new String[] { DB.COLUMN_ID2, DB.COLUMN_NUM2, DB.COLUMN_TITLE2,
				DB.COLUMN_BARSCN2 };
		int[] to2 = new int[] { R.id.itemID2, R.id.itemNum2, R.id.itemTitle2, R.id.itemBarscn2 };

		// создааем адаптер и настраиваем список
		scAdapter2 = new SimpleCursorAdapter(this, R.layout.item2, cursor2, from2,
				to2);
		lvData2 = (ListView) findViewById(R.id.lvData2);
		lvData2.setAdapter(scAdapter2);

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

				showDialog(IDM_ACTION);
			}
		});
	}

	void editDate2() {
		Intent iMessage2 = new Intent(getApplicationContext(), Message2.class);
		startActivity(iMessage2);
		remove2 = 1;
		Message2.num2 = db.getNum2(m_id2);
		Message2.title2 = db.getTitle2(m_id2);
		Message2.barscn2 = db.getBarscn2(m_id2);
	}

	@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) {
						editDate2();
					}
					// удалить
					if (item == 1) {
						showDialog(IDM_REMOVE);
					}

					// отмена
					if (item == 2) {
						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) {
							Food.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_id2 != 0)
								m_delRec2();
						}
					});
			builder2.setNegativeButton("Нет",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							dialog.cancel();
						}
					});
			builder2.setCancelable(false);
			return builder2.create();

		}
	}

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

	// обработка нажатия кнопки "добавить товар"
	public void onButtonClick_addRec2(View view) {
		Intent iMessage2 = new Intent(this, Message2.class);
		startActivity(iMessage2);
	}

	public void addReccordToDB2(String num2, String title2, String barscn2) {
		// удаляем старую запись
		if (m_id2 != 0)
			m_delRec2();

		// добавляем запись
		db.addRec2(num2, title2, barscn2);
		// обновляем курсор
		refreshCursor2();
		// даем адаптеру новый курсор
		scAdapter2.changeCursor(cursor2);
		m_id2 = 0;
	}

	void m_delRec2() {
		db.delRec2(m_id2);
		// обновляем курсор
		refreshCursor2();
		// даем адаптеру новый курсор
		scAdapter2.changeCursor(cursor2);
		m_id2 = 0;
	}

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

//	@Override
//	public void onBackPressed() {
//		//showDialog(IDM_EXIT);
//		//Intent ShopActivity = new Intent(this, ShopActivity.class);
//		//startActivity(ShopActivity);
//		Food.this.finish();
//	}

}
ЛОГКАТ

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

06-28 15:21:18.088: E/AndroidRuntime(6239): FATAL EXCEPTION: main
06-28 15:21:18.088: E/AndroidRuntime(6239): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shop.database/com.shop.database.Food}: java.lang.IllegalArgumentException: column '_id2' does not exist
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.os.Looper.loop(Looper.java:137)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread.main(ActivityThread.java:5041)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at java.lang.reflect.Method.invoke(Method.java:511)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at dalvik.system.NativeStart.main(Native Method)
06-28 15:21:18.088: E/AndroidRuntime(6239): Caused by: java.lang.IllegalArgumentException: column '_id2' does not exist
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:333)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:81)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at com.shop.database.Food.onCreate(Food.java:55)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.Activity.performCreate(Activity.java:5104)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-28 15:21:18.088: E/AndroidRuntime(6239): 	... 11 more
UPD. На всякий случай код создания БД

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

package com.shop.database;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DB {
	private static final String DB_NAME = "mydb400.db";
	private static final int DB_VERSION = 1;
	private static final String DB_TABLE = "Shop";

	public static final String COLUMN_ID = "_id";
	public static final String COLUMN_TITLE = "title";
	public static final String COLUMN_LATITUDE = "latitude";
	public static final String COLUMN_LONGITUDE = "longitude";
	public static final String COLUMN_BARSCN = "barscn";

	private static final String DB_TABLE2 = "Food";

	public static final String COLUMN_ID2 = "_id2";
	public static final String COLUMN_NUM2 = "num2";
	public static final String COLUMN_TITLE2 = "title2";
	public static final String COLUMN_BARSCN2 = "barscn2";
  
	private static final String DB_CREATE1 =
	    "create table " + DB_TABLE + "(" +
	      COLUMN_ID + " integer primary key autoincrement, " +
	      COLUMN_TITLE + " text, " +
	      COLUMN_LATITUDE + " text, " +
	      COLUMN_LONGITUDE + " text, " + 
	      COLUMN_BARSCN + " text " +
	    ");";
	
	 private static final String DB_CREATE2 =
		"create table " + DB_TABLE2 + "(" +
		   COLUMN_ID2 + " integer primary key autoincrement, " +
		   COLUMN_NUM2 + " text, " +
		   COLUMN_TITLE2 + " text, " +			
		   COLUMN_BARSCN2 + " text " +
		");";
	  
	private final Context mCtx;

	private DBHelper mDBHelper;
	private SQLiteDatabase mDB;

	public DB(Context ctx) {
		mCtx = ctx;
	}

	// открыть подключение
	public void open() {
		mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
		mDB = mDBHelper.getWritableDatabase();
	}

	// закрыть подключение
	public void close() {
		if (mDBHelper != null)
			mDBHelper.close();
	}

// SHOP TABLE /////////////////////////////////////////////////////////////////////////
	// получить все данные из таблицы DB_TABLE
	public Cursor getAllData() {
		return mDB.query(DB_TABLE, null, null, null, null, null, null);
	}

	// получить данные из таблицы DB_TABLE
	public String getTitle(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE,
				new String[] { COLUMN_ID, COLUMN_TITLE }, COLUMN_ID + "="
						+ rowIndex, null, null, null, null);

		int columnIndex = c.getColumnIndex(COLUMN_TITLE);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	public String getLatitude(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE, new String[] { COLUMN_ID,
				COLUMN_LATITUDE }, COLUMN_ID + "=" + rowIndex, null, null,
				null, null);

		int columnIndex = c.getColumnIndex(COLUMN_LATITUDE);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	public String getLongitude(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE, new String[] { COLUMN_ID,
				COLUMN_LONGITUDE }, COLUMN_ID + "=" + rowIndex, null, null,
				null, null);

		int columnIndex = c.getColumnIndex(COLUMN_LONGITUDE);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	public String getBarscn(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE,
				new String[] { COLUMN_ID, COLUMN_BARSCN }, COLUMN_ID + "="
						+ rowIndex, null, null, null, null);

		int columnIndex = c.getColumnIndex(COLUMN_BARSCN);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	// добавить запись в DB_TABLE
	public void addRec(String title, String latitude, String longitude,
			String barscn) {
		ContentValues cv = new ContentValues();
		cv.put(COLUMN_TITLE, title);
		cv.put(COLUMN_LATITUDE, latitude);
		cv.put(COLUMN_LONGITUDE, longitude);
		cv.put(COLUMN_BARSCN, barscn);
		mDB.insert(DB_TABLE, null, cv);
	}

	// удалить запись из DB_TABLE
	public void delRec(long id) {
		mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
	}
// SHOP TABLE END ///////////////////////////////////////////////////////////////////////// 
	  
// FOOD TABLE 2/////////////////////////////////////////////////////////////////////////
	// получить все данные из таблицы DB_TABLE2
	public Cursor getAllData2() {
		return mDB.query(DB_TABLE2, null, null, null, null, null, null);
	}

	// получить данные из таблицы DB_TABLE2
	public String getNum2(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE2,
				new String[] { COLUMN_ID2, COLUMN_NUM2 }, COLUMN_ID2 + "="
						+ rowIndex, null, null, null, null);

		int columnIndex = c.getColumnIndex(COLUMN_NUM2);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	public String getTitle2(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE2, new String[] { COLUMN_ID2,
				COLUMN_TITLE2 }, COLUMN_ID2 + "=" + rowIndex, null, null, null,
				null);

		int columnIndex = c.getColumnIndex(COLUMN_TITLE2);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	public String getBarscn2(long rowIndex) {
		String value = "";

		Cursor c = mDB.query(DB_TABLE2, new String[] { COLUMN_ID2,
				COLUMN_BARSCN2 }, COLUMN_ID2 + "=" + rowIndex, null, null,
				null, null);

		int columnIndex = c.getColumnIndex(COLUMN_BARSCN2);
		if (c.moveToNext()) {
			value = c.getString(columnIndex);
		}

		return value;
	}

	// добавить запись в DB_TABLE2
	public void addRec2(String num2, String title2, String barscn2) {
		ContentValues cv2 = new ContentValues();
		cv2.put(COLUMN_NUM2, num2);
		cv2.put(COLUMN_TITLE2, title2);
		cv2.put(COLUMN_BARSCN2, barscn2);
		mDB.insert(DB_TABLE2, null, cv2);
	}

	// удалить запись из DB_TABLE2
	public void delRec2(long id) {
		mDB.delete(DB_TABLE2, COLUMN_ID2 + " = " + id, null);
	}
// FOOD TABLE 2 END ///////////////////////////////////////////////////////////////////////// 
	  
	// класс по созданию и управлению БД
	private class DBHelper extends SQLiteOpenHelper {

		public DBHelper(Context context, String title, CursorFactory factory,
				int version) {
			super(context, title, factory, version);
		}

		// создаем и заполняем БД
		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DB_CREATE1);
			db.execSQL(DB_CREATE2);

			 ContentValues cv1 = new ContentValues();
			 //for (int i = 1; i < 2; i++) {
			 cv1.put(COLUMN_TITLE, "Title");
			 cv1.put(COLUMN_LATITUDE, "LATITUDE");
			 cv1.put(COLUMN_LONGITUDE, "LONGITUDE");
			 cv1.put(COLUMN_BARSCN, "BARCODE");
			 db.insert(DB_TABLE, null, cv1);
			 //}
			
			 ContentValues cv2 = new ContentValues();
			 //for (int i = 1; i < 2; i++) {
			 cv2.put(COLUMN_NUM2, "num2");
			 cv2.put(COLUMN_TITLE2, "Title2");			 
			 cv2.put(COLUMN_BARSCN2, "ЗАРАБОТАЛО");
			 db.insert(DB_TABLE2, null, cv2);
			// }
			 
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		}
	}
}



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

Re: SQLite + Activity

Сообщение Foenix » 28 июн 2013, 20:55

Остальное потом гляну, но сразу в глаза бросается - у второй таблицы тоже должен быть _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 » 28 июн 2013, 21:45

Спасибо, буду ждать.

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

Re: SQLite + Activity

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

Первый xml как называется? это xml строки списка, так?
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 » 28 июн 2013, 22:35

У тебя метод getAllData неправильный. Нужно сделать или два, или передавать наименование таблички как параметр - чтоб то из одной выбиратЬ, то из другой. А так - у тебя только из первой выбирается. ПОэтому там нет такого столбика. Но следующей ошибкой будет "нет столбца с именем id_", т.к. в обоих таблицах он должен быть.
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 » 28 июн 2013, 22:36

Если ты расскажешь, что означают столбики во второй таблице.. то я еще тебе что-нибудь умное скажу)

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

private static final String DB_TABLE2 = "Food"; 
 
    public static final String COLUMN_ID2 = "_id2"; 
    public static final String COLUMN_NUM2 = "num2"; 
    public static final String COLUMN_TITLE2 = "title2"; 
    public static final String COLUMN_BARSCN2 = "barscn2"; 
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 » 28 июн 2013, 22:53

Первый xml как называется? это xml строки списка, так?
Это и правда xml разметки строки списка, сам список в main2.xml.
У тебя метод getAllData неправильный.
Ё маё, капец какой фэйл, столько раз смотрел и не видел.
Нужно сделать или два, или передавать наименование таблички как параметр - чтоб то из одной выбиратЬ, то из другой. А так - у тебя только из первой выбирается. ПОэтому там нет такого столбика.
После исправления на вызов cursor2 = db.getAllData2(); ругается на отсутствие столбика "_id" (я переименовал _id2 в _id).

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

06-28 22:45:50.915: E/AndroidRuntime(1854): FATAL EXCEPTION: main
06-28 22:45:50.915: E/AndroidRuntime(1854): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shop.database/com.shop.database.Food}: java.lang.IllegalArgumentException: column '_id' does not exist
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread.access$600(ActivityThread.java:140)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.os.Looper.loop(Looper.java:137)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread.main(ActivityThread.java:4895)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at java.lang.reflect.Method.invoke(Method.java:511)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at dalvik.system.NativeStart.main(Native Method)
06-28 22:45:50.915: E/AndroidRuntime(1854): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:302)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.widget.CursorAdapter.init(CursorAdapter.java:168)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.widget.CursorAdapter.<init>(CursorAdapter.java:116)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at com.shop.database.Food.onCreate(Food.java:55)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.Activity.performCreate(Activity.java:5163)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
06-28 22:45:50.915: E/AndroidRuntime(1854): 	... 11 more
Но следующей ошибкой будет "нет столбца с именем id_", т.к. в обоих таблицах он должен быть.
Это не понял.
У меня же и так 2 метода для двух таблиц?

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

	public Cursor getAllData() {
		return mDB.query(DB_TABLE, null, null, null, null, null, null);
	}

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

public Cursor getAllData2() {
		return mDB.query(DB_TABLE2, null, null, null, null, null, null);
	}
Если ты расскажешь, что означают столбики во второй таблице.. то я еще тебе что-нибудь умное скажу)
А что о них сказать то? num2 будет брать _id из первой таблицы при нажатии на соответствующую строчку (я этого пока не делал, надо будет думать как), остальное просто заполянемые поля.

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

Re: SQLite + Activity

Сообщение Foenix » 28 июн 2013, 23:00

Ты версию БД должен сменить и обновить структуру.
ЧТо же касается имен второй таблицы..
1. не бойся называть имена столбцов одинаково. Например, если у тебя и в той и в другой таблице есть поле наименование - то и называть его нужно Name или Caption,
2. если у тебя в одной таблице будет ссылка на строку другой таблицы (т.е. содержать _id первой таблицы), то лучше назвать это дело id_table1 (или в твоем случае id_shop), тогда и тебе и тому, кто проверяет твой код (или хочет помочь) будет понятно сразу что это за столбик.
3. не нужно в таблице делать поля особо сокращенного наименования как Num (это кстати, сокращение от Number - количество), и писать в имена вдруг цифры (только если у тебя в таблице например два однородных столбика - например два телефона , которые никак не различаются)
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 » 28 июн 2013, 23:27

Ты версию БД должен сменить и обновить структуру.
Ясно, я пересоздал БД и всё заработало. Метод обновления мне не нужен, я делаю конечную базу. Большое спасибо.
По поводу пунктов: понял, запомню.

Может подскажете ещё, как лучше реализовать отслеживание нажатия по строке первой таблицы и переход к второй таблице с выборкой только строк с таким же id (сейчас поле num2 для этого).

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

Re: SQLite + Activity

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

Monster писал(а):
Ты версию БД должен сменить и обновить структуру.
Ясно, я пересоздал БД и всё заработало. Метод обновления мне не нужен, я делаю конечную базу. Большое спасибо.
По поводу пунктов: понял, запомню.

Может подскажете ещё, как лучше реализовать отслеживание нажатия по строке первой таблицы и переход к второй таблице с выборкой только строк с таким же id (сейчас поле num2 для этого).
1. "Метод обновления" нужен всем. Все создают "конечную базу" :) Просто в простейшем случае - это как в уроке - удалить таблицу и создать новую.
2. Мы "Нажимаем" не на строки в таблице, а на строчки списка, в котором содержатся данные из курсора, который получается из таблицы.
Самое главное для тебя - сообразить по этой строчке, какой ей соответствет id. Если честно мне немного леньп исать, т.к. поздно, Но это есть в уроках (посмотри тот урок, где рассматриваются списки с чекбоксами).
Как только ты получил Id нужной строчки, то вызывай вместо метода getalldata, другой метод (его нужно написать) который по этому айди выбирает все записи второй таблицы. Лучше сделать запросом
select * from table2 where id_table1=100500
только вместо цифры параметр, естественно.
Этот метод точно так же вернет курсор, по которому ты сделаешь другой список.
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, 00:31

1. "Метод обновления" нужен всем. Все создают "конечную базу" Просто в простейшем случае - это как в уроке - удалить таблицу и создать новую.
Вроде он необходим только в случае серьёзного изменения таблицы, например добавления новой колонки и чтобы при этом не потерять остальные, разве нет?
2. Мы "Нажимаем" не на строки в таблице, а на строчки списка, в котором содержатся данные из курсора, который получается из таблицы.
Это я понимаю, просто почему-то так выразился. По поводу урока я его проходил, больше интересовал сам метод, видимо параметры getalldata тут не помогут.
Да, поздновато, сам завтра буду делать. Ещё раз большое спасибо!

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

Re: SQLite + Activity

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

Ну есть один толкьо "серьезный" вид изменения таблицы - это когда пользователь уже работает с программой, у него там данные, а тут ты вдруг решил обновить структуру таблиц.
А для всех остальных подойдет метод из урока - удаляем таблицу, если она есть, и создаем другую с обновленной структурой. Просто за время программирования - можно раз 50 эту структуру доводить до ума (это как раз нормально!), разве что тебе эту струкутур не какой-нибудь гений выложил.
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, 00:56

Я уже ночью ничего не соображаю :D
Имелось ввиду вот это?

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

db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME1);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME2);
onCreate(db);
Чтобы не создавать сам файл .db с нуля (например переименовав базу и чтобы "заработало")?

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

Re: SQLite + Activity

Сообщение Foenix » 29 июн 2013, 02:38

конечно!
Подправляешь строки (где создаются таблицы), меняешь номер версии - и все.
R.id.team

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

Ответить