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

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

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

Сообщение Foenix » 28 окт 2012, 13:22

через командную могу, но это как в потемках :( ХОтелось экспрорер глянуть, пошариться что там да как в файловой системе.

Имена таблиц нужны, мы их пишем в запросах, я про имя базы данных спрашивала - не пойму где мы его указываем-то? у меня все работает с таблицей, имя БД вообще нигде не упоминается даже!
И если создавать отдельный класс с другой таблицей - куда тогда девать

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

private DatabaseHelper DBHelper;
	private SQLiteDatabase db;
?
они ведь private описаны, или их нужно повторяь в каждом классе с таблицей и делать тоже их приватными? Но так ерунда какая-то получается - на каждую таблицу свое подключение. Оно ведь нужно одно на всю БД и все активити.
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 » 28 окт 2012, 13:48

Вы что то не туда смотрите что ли))) когда подключаемся к бд то указываем к какой именно подключаемся:

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

db = new DBHelper(this, AppData.DATABASE_NAME, null, 1);
внимательно посмотрите на конструкторы SQLiteOpenHelper'a
И что это за идея создавать отдельный класс для каждой таблицы (нету подходящего смайлика). Например вот вам метод который возвращает курсор на все данные из любой таблицы:

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

public List<YourClass> getAll(Type table) {
   List<YourClass> allList = new ArrayList<YourClass>();
   String query = "SELECT * FROM " + table;
   SQLiteDatabase db = this.getReadableDatabase();
   Cursor cursor = db.rawQuery(query, null);
   switch(table) {
   case Type.TABLE_ONE:
      if(cursor.moveToFirst()) {
	do {
		YourClass yc = new YourClass();
			yc.setId(Integer.parseInt(cursor.getString(0)));
			yc.setTitle(cursor.getString(1));
			yc.setPrice(Double.parseDouble(cursor.getString(2)));
			allList.add(yc);
		} while(cursor.moveToNext());
	}
      break;
      //и т.д.
   }
   return allList;
}
Type = это enum, удобно что бы использовать в switch-case конструкции.
R.id.team
Политика на форуме запрещена

arreke
Сообщения: 7
Зарегистрирован: 09 окт 2012, 13:51

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

Сообщение arreke » 29 окт 2012, 06:12

создаю таблицу, где поле money типа Integer:

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

db.execSQL("create table mytable ("
          + "id integer primary key autoincrement," 
          + "money integer" + ");");
ввожу данные, нарошно для поля money ввожу не цифру:

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

      ContentValues cv = new ContentValues();
      cv.put("money", "b-39.42");
      long rowID = db.insert("mytable", null, cv);
вывожу на печать, печатает как строку, не как цифру.
т.е. не важно какой тип выбрирать для полей, он все равно переделает его в текст, я правильно понял? или ошибаюсь?

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

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

Сообщение damager82 » 30 окт 2012, 12:51

arreke писал(а):т.е. не важно какой тип выбрирать для полей, он все равно переделает его в текст, я правильно понял? или ошибаюсь?
Похоже, что так. Из хелпа:
If the lossless conversion of TEXT to INTEGER or REAL is not possible then the value is stored using the TEXT storage class.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

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

Сообщение beeline09 » 31 окт 2012, 18:06

damager82 писал(а):
Можно ли создать сохранить базу на карте памяти, что бы потом без root-а скопировать её накомпьютер? Пробовал методы Androida openOrCreateDat abase, ноони в любом случае создают базу в data/date/your_package
У меня сработало.
Только надо добавить Permission - android.permission.WRITE_EXTERNAL_ STORAGE в манифест-файл.

Исходник:

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

void prepareBD() {
File sdCard = Environment.getExternalStor ageDirectory(); 
File directory = new File(sdCard.getAbsolutePath () + "/MyDB");
directory.mkdirs();
File dbFile = new File(directory, "database");
SQLiteDatabase db = SQLiteDatabase.openOrCreateDat abase(dbFile, null);
db.execSQL("drop table if exists mytab;");
db.execSQL("create table mytab (id integer primary key autoincrement, name text);");
db.execSQL("insert into mytab (name) values ('test');");
db.close();
}
Что-то я ничего не понял... Запускаю и вываливается с ошибкой, что базы нет. А как сделать, чтоб он создавал базу если нет? Она должна лежать по пути "/sdcard/MyFolder/<имя базы>". Вы можете объеденить свой пример с данным уроком? Я пока начинающий и не очень догоняю... :oops: А если увижу, то сразху пойму что и как надо делать.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 01 ноя 2012, 04:34

beeline09 писал(а): А как сделать, чтоб он создавал базу если нет?
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null, SQLiteDatabase.CREATE_IF_NECESSARY);

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

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

Сообщение beeline09 » 02 ноя 2012, 07:06

AndreyI писал(а):
beeline09 писал(а): А как сделать, чтоб он создавал базу если нет?
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, null, SQLiteDatabase.CREATE_IF_NECESSARY);
Спасибо! Получилось. А как сделать поисковый запрос состоящий из символов кирилицы? И вообще ,как делать поисковый запрос? У меня есть БД, в ней есть таблица и из нее я использую два столбца food и energy. Это таблица калорийности. Мне нужно по поисковому запроосу результаты вывести в...куда угодно-это сделаю.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 02 ноя 2012, 09:21

В SQLite Андроид создается дополнительная таблица android_metadata в ней одно единственное поле locale в которое записывается локаль при создании таблицы, локаль берется та, что установлена в данный момент в телефоне (или эмуляторе), для русской локали там должно быть ru_RU . Если это установлено, то SQLite Android должен понимать русский текст.

beeline09
Сообщения: 33
Зарегистрирован: 23 сен 2012, 23:10

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

Сообщение beeline09 » 02 ноя 2012, 10:35

AndreyI писал(а):В SQLite Андроид создается дополнительная таблица android_metadata в ней одно единственное поле locale в которое записывается локаль при создании таблицы, локаль берется та, что установлена в данный момент в телефоне (или эмуляторе), для русской локали там должно быть ru_RU . Если это установлено, то SQLite Android должен понимать русский текст.
Спасибо большое!!! А можете подсказать или еще лучше-показать как по нажатию на кнопку будет найдет текст из едит текста?

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 02 ноя 2012, 12:19

Доброго времени суток. Подскажите, пожалуйста, можно ли базу SQLite "держать" где-то в интернете? То есть сразу производить поиск по базе и записи добавлять в базу, которая в интернете на сервере?

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

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

Сообщение rezak90 » 02 ноя 2012, 12:36

Digetix писал(а):Доброго времени суток. Подскажите, пожалуйста, можно ли базу SQLite "держать" где-то в интернете? То есть сразу производить поиск по базе и записи добавлять в базу, которая в интернете на сервере?
Можно но это велосипед велосипедов))) Андроид не предусмотрен для этого.
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 02 ноя 2012, 13:05

rezak90 писал(а): Можно но это велосипед велосипедов))) Андроид не предусмотрен для этого.
Это плохо :) так что пользователям придется постоянно загружать новую базу? Если будет новая версия. И ещё вопрос: нашёл сайт parse.com, там вроде предлагают использовать их сайт как сервер для ресурсов. Может знаете что об этом?

Хотя как это не предназначен? У меня есть приложение, которое показывает погоду с сайта. Оно ж как-то берёт оттуда данные?

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

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

Сообщение rezak90 » 02 ноя 2012, 13:15

Данные берёт, все приложения берут. Но на прямую с бд они не работают. С бд работает сервер, а данные он отдаёт в виде API.
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 02 ноя 2012, 13:24

rezak90 писал(а):Данные берёт, все приложения берут. Но на прямую с бд они не работают. С бд работает сервер, а данные он отдаёт в виде API.
Ну так можно сделать так чтоб например была кнопка Добавить, при нажатии на неё происходит запись в базу на сервере, а при нажатии на кнопку Найти происходил поиск по базе на сервере?

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

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

Сообщение rezak90 » 02 ноя 2012, 13:52

Digetix писал(а):
rezak90 писал(а):Данные берёт, все приложения берут. Но на прямую с бд они не работают. С бд работает сервер, а данные он отдаёт в виде API.
Ну так можно сделать так чтоб например была кнопка Добавить, при нажатии на неё происходит запись в базу на сервере, а при нажатии на кнопку Найти происходил поиск по базе на сервере?
Вы не до конца понимаете данную архитектуру. Уже который раз в этой ветке поднимается вопрос обращения к удалённой бд. Функцию поиска/добавления/удаления и т.д. берёт на себя сервер. Андроид в свою очередь общается с сервером. Например: делаем http запрос на страницу http://site.ru/query.php?table=employer&show=all - страница которая выдаёт все данные по таблице employer, страница query.php распарсивыает get/post запрос и делает обращение к бд, результатом выдаёт значение в виде json массива/объекта как вам угодно. Актуально, быстро, компактно.
З.Ы. Все пришедшие кодить на андроид с десктопа пытаются подключится к бд на прямую как заведенно на десктопе, в мобайл версиях это не так.
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 02 ноя 2012, 15:19

А, теперь ясно. Спасибо :)

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

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

Сообщение Foenix » 02 ноя 2012, 16:49

rezak90 писал(а): З.Ы. Все пришедшие кодить на андроид с десктопа пытаются подключится к бд на прямую как заведенно на десктопе, в мобайл версиях это не так.
Поэтому способ этот вполне себе нормальный, незаморочистый, свои цели оправдывает.
И что значит - делает работу сервер или не сервер, он в любом случае работу делает, я, например, ему короткую команду посылаю, он возвращает данные. Различается только способ отправки-получения, формат получаемых данных, только и всего.
Последний раз редактировалось Foenix 03 ноя 2012, 11:27, всего редактировалось 1 раз.
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 » 02 ноя 2012, 18:26

Olivka
Не оправдан тем что канал в таком случае у вас не защищён, и вполне может прослушиваться. Как вы сможите зашифровать ваше прямое соединение с SQL ? И то что у вас летает по вай-фаю не значит что это быстро, давайте я попробую со своего мобильного 64кб/сек интернета и всё будет просто ужасно)))

P.S. Но самый главный минус в прямом подключении это то что если бд поменяется, или скажем удалится один столбик, или даже буковка в имени столбце то вам придётся переписывать запрос в самом приложении и соответственно обновлять приложение на самом рынке. Это ложится на плечи пользователей так как это лишние трудности. А так если по апи делать то все обновлени на сервере, а сервер один. Так где лучше производить изменения на одном сервере или на каждой апликухе?
R.id.team
Политика на форуме запрещена

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

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

Сообщение Foenix » 02 ноя 2012, 22:58

rezak90 писал(а): P.S. Но самый главный минус в прямом подключении это то что если бд поменяется, или скажем удалится один столбик, или даже буковка в имени столбце то вам придётся переписывать запрос в самом приложении и соответственно обновлять приложение на самом рынке. Это ложится на плечи пользователей так как это лишние трудности. А так если по апи делать то все обновлени на сервере, а сервер один. Так где лучше производить изменения на одном сервере или на каждой апликухе?
Стойте подождите..
во-первых я писала, что для своих целей это подходит. Ну хотели они именно этого! Закачивать из базы что нужно они будут в офисе, это два. И никто не зайдет оттуда по вайфаю к базе это три.
А четыре это то, что мне вообще-то пофик что там в табличке добавится или убавится, не влияющее на мою прогу, т.к. я использую ХП и вьюшки - менять не буду я ничего в программе. У нас куча прог на одну базу закручено, и все работают независимо.
Пять. Это ж для корпоратива. Я не предлагаю решение для примера выше, там ваш способ единственно верный, я лишь поделилась тем, что мой тоже норм.
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 » 03 ноя 2012, 04:59

Olivka
А ну если для корпоратива то ещё ладно, просто я знаю что у нас бы за такое по рукам дали за такую архитектуру, да ещё и возможно скидка к з/п =). Но если даже корпоративный проект то в любой конторе есть пускай свой но не большой сервер через который можно это всё организовать.
R.id.team
Политика на форуме запрещена

Ответить