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

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

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

Сообщение Foenix » 05 ноя 2012, 11:46

math64 писал(а):Ошибки в коде. И лучше использовать транзакции - без транзакций вставка идёт медленно.

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

private void insert() {
   ArrayList<MyClass> list = new ArrayList<MyClass>();
   list.add(new MyClass(5, "hello"));
   list.add(new MyClass(5, "world"));
   DBHelper dbHelper = new DBHelper(this);
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   db.beginTransaction();
   try {
      try {
      ContentValues cv = new ContentValues();

      for(int i = 0; i < list.size(); i++) {
         cv.put("x", list.get(i).getX());
         cv.put("word", list.get(i).getWord());
         long rowID = db.insert("matable", null, cv);
         if(rowID == -1)
            throw new Exception("error in insert to database");
      }
      } catch(Exception) { dbHelper.close(); } <====
      db.setTransactionSuccessful();
   } finally {
      db.endTransaction();
   }
   db.close();
   dbHelper.close();
}
Попробовала этот код.
Указывает на ошибку в ====> этом месте
Текст
Syntax error on token "Exception", VariableDeclaratorId expected after this token
Подскажите, что это означает.
У меня отлавливание ошибок - слабое место. Подскажите, пожалуйста, статейку на русском языке, чтоб для дураков объяснялось блоки try-finally и иже с ними.
Только не в общем, а именно с базами - что конкретно нужно писать в этих блоках.
R.id.team

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

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

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

Сообщение brucemax » 05 ноя 2012, 12:50

Подскажите, пожалуйста, статейку на русском языке, чтоб для дураков объяснялось блоки try-finally и иже с ними.
Только не в общем, а именно с базами - что конкретно нужно писать в этих блоках.
http://www.skipy.ru/technics/exceptions.html подробно понятным языком о try/catch/finally. Правда без баз.

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

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

Сообщение Foenix » 05 ноя 2012, 14:22

спасибо, почитаю!
просто умом я хорошо понимаю что к чему, но когда начинаю что-то писать в этих блоках, получается такая фишка, что при выполнении если просиходит ошибка, то и то что написано в finally или catch само тоже начинает выдавать ошибки)))
R.id.team

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

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

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

Сообщение brucemax » 05 ноя 2012, 22:13

Olivka писал(а):но когда начинаю что-то писать в этих блоках, получается такая фишка, что при выполнении если происходит ошибка, то и то что написано в finally или catch само тоже начинает выдавать ошибки)))
Да дилемма =)

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

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

Сообщение Foenix » 13 ноя 2012, 17:35

Пример:
DBHelper dbHelper = new DBHelper(this);

Подскажите, если я вызываю конструктор не из Активити, а из другого класса, то что мне передавать в качестве контекста? там что-то this не работает..
R.id.team

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

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

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

Сообщение rezak90 » 13 ноя 2012, 18:23

вам в любом случае контекст нужно передавать, просто гоняйте контекст по своим классам и всё.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Foenix » 13 ноя 2012, 18:35

и в поток тоже его передавать? из него getContext() и другие не хотят действовать.. ошибку пишет компилятор - типа "создайте свойство getContext"
R.id.team

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

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

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

Сообщение rezak90 » 13 ноя 2012, 19:03

а зачем вам в потоке контекст? при обращении к компонентам вы же будете лочить UI поток, что не есть хорошо и противопоказанно.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Foenix » 14 ноя 2012, 00:04

к каким компонентам? я к таблице хочу обратиться, хелперу то бишь, я ж привела пример
R.id.team

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

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

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

Сообщение rezak90 » 14 ноя 2012, 08:34

ну так в чём проблема передать потоку контекст, а поток уже передаст хелперу
R.id.team
Политика на форуме запрещена

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

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

Сообщение nubodroid » 05 дек 2012, 03:49

Всем привет!

Вопрос:

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

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

	public boolean isExist(SQLiteDatabase db, String table, ContentValues cv) {

		return false;
	}
проблема в том что внутри функции я не знаю какие ключи содержит cv. Т.е. это именно я не знаю как их оттуда выковырять...

Думал добавить еще один параметр

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

	public boolean isExist(SQLiteDatabase db, String table, ContentValues cv, String[] keys) {

		return false;
	}
но.... это получается дублирование информации, т.к. cv уже содержит названия ключей.

Вопрос в том, как выковырять названия ключей из cv?

В общем... хочу сделать примерно следующее

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

	public boolean isExist(SQLiteDatabase db, String table, ContentValues cv, String[] keys) {

		int size = cv.size();
		String myWhere = "";
		
		String[] keys = функция_которая_вытаскивает_все_ключи_из_cv(cv);
		
		for(int count = 0; count < size; count++) {
			
			myWhere += keys[count] + "=" + cv.get(keys[count]);
		}
		
		// тут формируем запрос к базе
		// если есть такая запись - return true
		
		return false;
	}
Всем заранее спасибо

З.Ы. Можно передать в функцию уже готовый запрос, но... А что но? Может так и сделаю... Какая разница, пихать в cv ключи и значения, а потом передавать cv в функцию или формировать запрос и передавать его.

З.З.Ы. Прошу прощения, возник другой вопрос... ммм... в общем... вот код

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

	public boolean isExist(SQLiteDatabase db, String table, String[] fields, String[] where, String[] selectionArgs) {
	
		String sql;
		Cursor cursor;
		
		sql = createWhereCondition(fields, where);
		
		cursor = db.rawQuery(sql, selectionArgs);
		
		int count = cursor.getCount();
		
		cursor.close();
		
		if (count > 0)
			return true;
		
		return false;
	}

	
	public static String createWhereCondition(String[] fields, String[] where) {

		String condition = "SELECT ";
		int count;
		
		for(count = 0; count < fields.length; count++) {
			
			condition += fields[count];
			
			if(count < (fields.length - 1)) {
				
				condition += ", ";
			}
		}
		
		condition += " WHERE ";
		
		for(count = 0; count < where.length; count++) {
			
			condition += where[count] + " = ?";
			
			if(count < (where.length - 1)) {
				
				condition += " AND ";
			}
		}
		
		return condition;
	}

в общем... я передаю значение поля name И..... rawQuery считает разными строки "Eto mojo imja", "etO MOJO imjA". Как это исправить?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

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

Сообщение neoksi » 05 дек 2012, 07:55

Смотри в сторону методов keySet() и valueSet() у ContentValues
http://developer.android.com/intl/ru/re ... alues.html

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

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

Сообщение nubodroid » 05 дек 2012, 08:25

neoksi писал(а):Смотри в сторону методов keySet() и valueSet() у ContentValues
http://developer.android.com/intl/ru/re ... alues.html
тенкс... Блин... ковырял же ContentValues... но... смотрю в книгу, а вижу....

avcorp
Сообщения: 3
Зарегистрирован: 21 ноя 2012, 07:25

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

Сообщение avcorp » 11 дек 2012, 07:36

Подскажите чтение БД из другого namaspace невозможно?
Пробывал DB_PATH + DB_NAME не видит базу в другом namespace.
А как же про версии программ, не потерять данные из бесплатной версии у них же разные namespace?
Разъясните пожалуйста!

С уважением Владимир.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 12 дек 2012, 10:46

avcorp писал(а):Подскажите чтение БД из другого namaspace невозможно?
Попробуйте sharedUserId использовать
http://developer.android.com/guide/topi ... tml#userid
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

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

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

Сообщение Foenix » 13 дек 2012, 04:21

Люди, как вы деньги в этой бд храните?
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: Урок 34. Хранение данных. SQLite

Сообщение Roman » 17 дек 2012, 09:50

KamiSempai писал(а):Самый лучший вариант это 4.
Ссылка на то как это делать: http://idev.by/android/145/
Спасибо за ссылку!
У меня три вопроса:
1. Если приложение мультиязычное, правильно ли я понимаю, что нужно создавать в одной базе все данные с разными языками, т.к. на приложение создается одна база?

2. Не понимаю эту вставку в метадейт

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

INSERT INTO android_metadata VALUES ('en_US');
именно "en_US", а если у меня несколько языков?

3. Если у меня несколько таблиц и я указываю уникальное id каждой таблицы то правильно ли я записываю как по классике SQL, например , т.е. еще добавляю "_", как этого требуют разработчики из google?
Спасибо за помощь!

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

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

Сообщение rezak90 » 17 дек 2012, 10:55

1. лучше конечно создавать одну бд, так как ничто не мешает создать таблицу под каждый язык или же доп поля в таблицах для языков, а вот на счёт более одной бд в приложении не уверен но думаю что можно;
2. указывается потому что разные кодировку могут быть, например с кирилицей в sqlite печалька;
3. не принципиально, но желательно именно так.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Roman » 17 дек 2012, 10:59

Спасибо за ответ!
rezak90 писал(а):например с кирилицей в sqlite печалька;
Подскажите, а как быть с данными на кириллице? Как их использовать лучше? Где об этом можно почитать, т.к. хочу попробовать сделать приложение с использованием текста на кириллице и с использованием базы.
И если я в одной базе буду использовать два языка английский и русский, то как тогда указывать в

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

INSERT INTO "android_metadata" VALUES ('en_US')
Спасибо большое за ответ!

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

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

Сообщение rezak90 » 17 дек 2012, 11:08

на хабре про кирилцу есть, сейчас ссылку отрою:
http://habrahabr.ru/post/57915/
http://habrahabr.ru/qa/8740/
http://habrahabr.ru/post/150543/
http://habrahabr.ru/post/122408/
R.id.team
Политика на форуме запрещена

Ответить