Страница 11 из 39

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

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

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

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

private DatabaseHelper DBHelper;
	private SQLiteDatabase db;
?
они ведь private описаны, или их нужно повторяь в каждом классе с таблицей и делать тоже их приватными? Но так ерунда какая-то получается - на каждую таблицу свое подключение. Оно ведь нужно одно на всю БД и все активити.

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

Добавлено: 28 окт 2012, 13:48
rezak90
Вы что то не туда смотрите что ли))) когда подключаемся к бд то указываем к какой именно подключаемся:

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

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 конструкции.

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

Добавлено: 29 окт 2012, 06:12
arreke
создаю таблицу, где поле 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);
вывожу на печать, печатает как строку, не как цифру.
т.е. не важно какой тип выбрирать для полей, он все равно переделает его в текст, я правильно понял? или ошибаюсь?

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

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

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

Добавлено: 31 окт 2012, 18:06
beeline09
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: А если увижу, то сразху пойму что и как надо делать.

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 02 ноя 2012, 12:36
rezak90
Digetix писал(а):Доброго времени суток. Подскажите, пожалуйста, можно ли базу SQLite "держать" где-то в интернете? То есть сразу производить поиск по базе и записи добавлять в базу, которая в интернете на сервере?
Можно но это велосипед велосипедов))) Андроид не предусмотрен для этого.

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

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

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

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

Добавлено: 02 ноя 2012, 13:15
rezak90
Данные берёт, все приложения берут. Но на прямую с бд они не работают. С бд работает сервер, а данные он отдаёт в виде API.

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

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

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

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

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

Добавлено: 02 ноя 2012, 15:19
Digetix
А, теперь ясно. Спасибо :)

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

Добавлено: 02 ноя 2012, 16:49
Foenix
rezak90 писал(а): З.Ы. Все пришедшие кодить на андроид с десктопа пытаются подключится к бд на прямую как заведенно на десктопе, в мобайл версиях это не так.
Поэтому способ этот вполне себе нормальный, незаморочистый, свои цели оправдывает.
И что значит - делает работу сервер или не сервер, он в любом случае работу делает, я, например, ему короткую команду посылаю, он возвращает данные. Различается только способ отправки-получения, формат получаемых данных, только и всего.

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

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

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

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

Добавлено: 02 ноя 2012, 22:58
Foenix
rezak90 писал(а): P.S. Но самый главный минус в прямом подключении это то что если бд поменяется, или скажем удалится один столбик, или даже буковка в имени столбце то вам придётся переписывать запрос в самом приложении и соответственно обновлять приложение на самом рынке. Это ложится на плечи пользователей так как это лишние трудности. А так если по апи делать то все обновлени на сервере, а сервер один. Так где лучше производить изменения на одном сервере или на каждой апликухе?
Стойте подождите..
во-первых я писала, что для своих целей это подходит. Ну хотели они именно этого! Закачивать из базы что нужно они будут в офисе, это два. И никто не зайдет оттуда по вайфаю к базе это три.
А четыре это то, что мне вообще-то пофик что там в табличке добавится или убавится, не влияющее на мою прогу, т.к. я использую ХП и вьюшки - менять не буду я ничего в программе. У нас куча прог на одну базу закручено, и все работают независимо.
Пять. Это ж для корпоратива. Я не предлагаю решение для примера выше, там ваш способ единственно верный, я лишь поделилась тем, что мой тоже норм.

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

Добавлено: 03 ноя 2012, 04:59
rezak90
Olivka
А ну если для корпоратива то ещё ладно, просто я знаю что у нас бы за такое по рукам дали за такую архитектуру, да ещё и возможно скидка к з/п =). Но если даже корпоративный проект то в любой конторе есть пускай свой но не большой сервер через который можно это всё организовать.