Урок 34. Хранение данных. SQLite

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

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 08 сен 2014, 20:10

qw123 писал(а):Подскажите пожалуйста в чём ошибка
Cursor c = db.query("id", null, "p1=? or p2=? or p3=?", new String[] {p1, p2, p3}, null, null, null);
Первым параметром должно быть имя таблицы. У вас есть в базе таблица "id"?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 08 сен 2014, 20:51

http://developer.android.com/reference/ ... html#query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String)
R.id.team

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

qw123
Сообщения: 41
Зарегистрирован: 27 июн 2014, 12:11

Re: Урок 34. Хранение данных. SQLite

Сообщение qw123 » 09 сен 2014, 07:31

KamiSempai писал(а):
qw123 писал(а):Подскажите пожалуйста в чём ошибка
Cursor c = db.query("id", null, "p1=? or p2=? or p3=?", new String[] {p1, p2, p3}, null, null, null);
Первым параметром должно быть имя таблицы. У вас есть в базе таблица "id"?
Да, это и есть моя единственная таблица "id"

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 09 сен 2014, 09:27

тогда смотрите, что пишется в логах, гадалок тут нет.
R.id.team

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

qw123
Сообщения: 41
Зарегистрирован: 27 июн 2014, 12:11

Re: Урок 34. Хранение данных. SQLite

Сообщение qw123 » 09 сен 2014, 09:34

То есть условие записано верно и теоретически должно всё работать, так?

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 09 сен 2014, 10:15

нет, не так. Тут что угодно может не работать. Но это выясняется при запуске приложения.
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: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 09 сен 2014, 10:18

если у тебя последние параметр null, то можно использовать этот метод
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
R.id.team

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

qw123
Сообщения: 41
Зарегистрирован: 27 июн 2014, 12:11

Re: Урок 34. Хранение данных. SQLite

Сообщение qw123 » 09 сен 2014, 18:11

Foenix писал(а):тогда смотрите, что пишется в логах, гадалок тут нет.
Спасибо, оказывается при создании таблицы запятую пропустил и два поля таблицы слились в одно. Непривычно написание одного метода на несколько строк.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 09 сен 2014, 20:46

всегда смотрите на сообщения компилятора до запуска и в лог после запуска - все будет хорошо.
R.id.team

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

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение Sky-VIN » 16 сен 2014, 08:19

Смотришь код, всё ясно, как день.
Но когда закрываешь урок и пытаешься сам написать подобное... :cry:

Что-то свое:
1.

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

@Override
public void onCreate(SQLiteDatabase db) {
	db.execSQL("create table Contacts ("
			+ "id integer primary key autoincrement,"
			+ "Name text,"
			+ "Surname text,"
			+ "Age text"
			+ ");");
}
Тут вообще не понятно, как строка влияет на создание БД...
-------------------------
2.

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

case R.id.btnRead:
	Log.d(TAG, "--- Rows in Contacts: ---");
	Cursor c = db.query("Contacts", null,null,null,null,null,null);
	if(c.moveToFirst()) {
		int idColIndex = c.getColumnIndex("id");
		int NameColIndex = c.getColumnIndex("Name");
		int SurnameColIndex = c.getColumnIndex("Surname");
		int AgeColIndex = c.getColumnIndex("Age");
		
		do {
			Log.d(TAG,
					"ID = " + c.getInt(idColIndex)+
					"Name = " + c.getString(NameColIndex)+
					"Surname = " + c.getString(SurnameColIndex)+
					"Age = " + c.getString(AgeColIndex));
		} while(c.moveToNext());
	} else Log.d(TAG, "DB is empty");
	
	break;
Тут выкидывает с ошибкой:
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.
Make sure the Cursor is initialized correctly before accessing data from it.


С созданием / добавлением вроде проблем нет...



Дальше - хуже? :?
Завтра будет.
Лучше.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 16 сен 2014, 13:12

вначале посмотри в какой строке ошибка
если в этих
int idColIndex = c.getColumnIndex("id");
int NameColIndex = c.getColumnIndex("Name");
int SurnameColIndex = c.getColumnIndex("Surname");
int AgeColIndex = c.getColumnIndex("Age");
или в этих
"ID = " + c.getInt(idColIndex)+
"Name = " + c.getString(NameColIndex)+
"Surname = " + c.getString(SurnameColIndex)+
"Age = " + c.getString(AgeColIndex));
значит в курсоре-результате нет такой колонки. А какой? в логе и в курсоре смотри.
R.id.team

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

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение Sky-VIN » 16 сен 2014, 13:27

Тут норм:
int idColIndex = c.getColumnIndex("id");
int NameColIndex = c.getColumnIndex("name");
int SurnameColIndex = c.getColumnIndex("surname");
int AgeColIndex = c.getColumnIndex("age");

"ID = " + c.getInt(idColIndex) отрабатывает,
далее выкидывает на остальных. Каждую проверил.

Но всё же прописано:

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

		ContentValues cv = new ContentValues();
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		
		String name = etName.getText().toString();
		String surname = etSurname.getText().toString();
		String age = etAge.getText().toString();

case R.id.btnAdd:
			Log.d(TAG, "--- Insert in contacts: ---");
			cv.put("name", name);
			cv.put("surname", surname);
			cv.put("age", age);
			
			long rowID = db.insert("Contacts", null, cv);
			Log.d(TAG, "row inserted, ID = " + rowID);
			
			break;
Ошибка:
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:492)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
Завтра будет.
Лучше.

Аватара пользователя
Sky-VIN
Сообщения: 21
Зарегистрирован: 06 сен 2014, 00:05
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение Sky-VIN » 22 сен 2014, 11:18

Объясните, пожалуйста этот код.

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

		@Override
		public void onCreate(SQLiteDatabase db) {
			Log.d(tag, "--- onCreate database ---");
			db.execSQL("create table Contacts ("
			+ "id integer primary key autoincrement,"
			+ "name text,"
			+ "surname text,"
			+ "age text" + ");");
		}
Точнее строку db.execSQL(String sql)
Завтра будет.
Лучше.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 22 сен 2014, 13:25

Цитата из урока:
В методе onCreate этого класса мы используем метод execSQL объекта SQLiteDatabase для выполнения SQL-запроса, который создает таблицу. Напомню – этот метод вызывается, если БД не существует и ее надо создавать. По запросу видно, что мы создаем таблицу mytable с полями id, name и email.
R.id.team

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

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

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 22 сен 2014, 13:26

Sky-VIN писал(а):Объясните, пожалуйста этот код.

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

		@Override
		public void onCreate(SQLiteDatabase db) {
			Log.d(tag, "--- onCreate database ---");
			db.execSQL("create table Contacts ("
			+ "id integer primary key autoincrement,"
			+ "name text,"
			+ "surname text,"
			+ "age text" + ");");
		}
Точнее строку db.execSQL(String sql)
http://www.sqlite.org/lang_createtable.html
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

AlexKem
Сообщения: 9
Зарегистрирован: 27 авг 2014, 08:59

Re: Урок 34. Хранение данных. SQLite

Сообщение AlexKem » 26 сен 2014, 07:24

Похоже данная проблема только у меня. Я уже многое перепробывал. Но логи - не работают. Что можно сделать?

AlexKem
Сообщения: 9
Зарегистрирован: 27 авг 2014, 08:59

Re: Урок 34. Хранение данных. SQLite

Сообщение AlexKem » 26 сен 2014, 07:42

Вот скрин, вдруг я что-то не там смотрю
скрин1.jpg
скрин1.jpg (93.44 КБ) 12108 просмотров

Аватара пользователя
Leeroy
Сообщения: 67
Зарегистрирован: 12 дек 2013, 21:25

Re: Урок 34. Хранение данных. SQLite

Сообщение Leeroy » 27 сен 2014, 19:46

AlexKem писал(а):Вот скрин, вдруг я что-то не там смотрю
скрин1.jpg
Открой перспективу DDMS в правом верхнем углу и там найди logcat
Java Core -> JDBC -> GoF -> Android SDK ->...
Телепрограмма в твоем смарте Телепрограмма

AlexKem
Сообщения: 9
Зарегистрирован: 27 авг 2014, 08:59

Re: Урок 34. Хранение данных. SQLite

Сообщение AlexKem » 29 сен 2014, 10:07

Leeroy писал(а):
AlexKem писал(а):Вот скрин, вдруг я что-то не там смотрю
Вложение скрин1.jpg больше недоступно
Открой перспективу DDMS в правом верхнем углу и там найди logcat
Открыл. Никаких сообщений там нет. (Скрин приложил)
скрин2.jpg
скрин2.jpg (182.84 КБ) 12090 просмотров
Особенности. Когда открывал сначала DDMS, а потом эмулятор, то эмулятор был пустой (приложение не запустилось), а в DDMS не было девайса. Потом попробывал сначала открыть приложение в эмуляторе, а потом уже перейти на DDMS. Вот тогда приложение работало, но ЛогКэт все равно пустой.

Также сообщаю, что использую девайс под андроидом 4.2 (в уроках советуют 2.3). Также отмечу, что на более ранних уроках (урок 12, где показывают принципы работы с логом), лог работал. Между этим я ничего не менял, разве что ставил еще одно устройство для Google Map (урок перед хранением данных).

Также отмечу, что я не накапливаю пройденные уроки, а каждый раз стираю андроид проекты, и создаю заново.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 29 сен 2014, 10:25

открывай эмулятор не автоматически при запуске приложения, а отдельно, даже до запуска эклипса из менеджера AVD.
если лог будет пустой, то перезапусти ADB
adb kill-server
adb start-server
adb devices
последнюю команду можно опустить, она просто список подключенных устрйоств открывает.
R.id.team

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

Ответить