Запити до бази даних і зчитування інформації з бази даних

Існує багато способів зчитування інформації з бази даних SQL, але всі вони зводяться до базової послідовності операцій

1 Створення пропозиції SQL, що описує дані, які вам потрібно отримати

2 Застосування цієї пропозиції до бази даних

3 Відображення результуючих даних SQL на такі структури даних, які будуть зрозумілі мови, з яким ви працюєте

Цей процес може бути дуже складний при застосуванні спеціальних програм обєктно-реляційного відображення або відносно простий, але трудомісткий при написанні запитів всередині вашої програми Інструменти для обєктно-реляційного відображення (object relational mapping, ORM, http://ruwikipediaorg/wiki/ ORM) захищають код від складнощів, повязаних з програмуванням баз даних і відображенням (асоціювання) обєктів Ці проблеми не зникають, а просто не відволікають вас від роботи Ви можете досягти більшої відмовостійкості коду в тому, що стосується змін бази даних, але для цього доведеться провести складну настройку обєктно-реляційного відображення, а потім займатися підтримкою цієї системи В даний час обєктно-реляційне відображення в програмах Android, як правило, не застосовується

Простий підхід з написанням запитів у вашому додатку гарний лише для дуже невеликих проектів, які не будуть особливо змінюватися з плином часу Додатки, прямо в коді яких міститься код бази даних, характеризуються додаткової нестійкістю, оскільки, коли схема бази даних змінюється, весь код, який посилається на цю базу даних, повинен бути перевірений і, можливо, переписаний

Звичайний компромісний підхід полягає в тому, що вся логіка бази даних витягується в безліч обєктів, єдина мета яких – перетворювати запити додатки в запити до бази даних і відправляти отримані результати назад в додаток Саме такий підхід ми застосували в додатку MJAndroid Весь код бази даних міститься в одному класі Mi croJobsDatabase, який також доповнює SQLiteOpenHelper Але із застосуванням постачальника вмісту SimpleFinchVideoContentProvider база даних залишається досить простий і нам не доводиться вдаватися до використання зовнішніх рядків

Android дозволяє модифікувати курсори, якщо вони не застосовуються з постачальниками вмісту Ми обовязково скористаємося цією можливістю, щоб ще сильніше зменшити залежності коду і приховати всю інформацію про кожної конкретної операції бази даних у нашому модифікованому курсорі Інтерфейс для зухвалої сторони в методі get Jobs класу Mi croJobsDatabase вперше зявляється в тому коді, який ми наведемо нижче Завдання методу полягає в тому, щоб повернути JobsCursor, в якому перераховані вакансії з бази даних Один параметр, переданий методу getJobs, дозволяє користувачеві вибрати, як впорядкувати отримані вакансії – по стовпцю title або за стовпцем employerjiame:

Далі даються пояснення до коду

Функція, що формує запит залежно від того, яку сортування стовпців замовив користувач (тобто залежно від параметра sortBy) Ця ж функція повертає результати у вигляді курсора

Створення рядка запиту Більшість рядків є статичними (змінна QUERY), але ця рядок залежить від вибору стовпця, по якому відбувається сортування Хоча QUERY і є закритим полем, що обрамляє клас як і раніше має доступ до неї Це пояснюється тим, що і метод get Jobs, і клас JobsCursor знаходяться всередині класу Mi croJobsDatabase, який і надає доступ до закритих елементів JobsCursor для методу getJobs Щоб отримати текст для сортувального стовпця, ми просто застосовуємо toString до перелічуваних параметру, переданому викликає стороною Ми могли б визначити асоціативний масив, який дозволив би нам більш вільно іменувати змінні, але наведене вище рішення простіше Крім того, назви стовпців достатньо красиво спливають на екрані – це робиться завдяки автозавершенням, передбаченому в нашій інтегрованої середовищі розробки

Отримує описатель бази даних

Створює курсор JobsCursor за допомогою методу rawQueryWithFactory класу SQLiteDatabase Він приймає фабричний метод, яким Android скористається, щоб створити курсор саме такого типу, який нам потрібен Якби ми скористалися більш простим методом rawQuery, то отримали б стандартний Cursor, у якого немає особливих властивостей JobsCursor

Для зручності зухвалої сторони, переходом до першого рядка у повернутому результаті Таким чином, курсор повертається вже готовим до використання Часто програміст забуває викликати moveToFirst, а потім рве на собі волосся, намагаючись зрозуміти, чому обєкт Cursor видає суцільні винятки

Курсор – це значення, що повертається Q Клас, що створює курсор, що повертається методом getJobs

Простий спосіб надати альтернативні критерії сортування: імена стовпців зберігаються в enum Цей тип використовується в елементі 2

Конструктор для модифікованого курсора Останній аргумент – це запит, переданий викликає стороною

Клас фабрики для створення курсора, вкладений в клас JobsCursor

Створюється курсор із запиту, переданого викликає стороною

Повертає курсор до зовнішнього класу JobsCursor

Допоміжні функції, извлекающие конкретні стовпці з рядка курсору Наприклад, getColTitle повертає значення стовпця title в рядку, на яку в даний момент посилається курсор Таким чином, реалізація бази даних відділяється від зухвалої коду та код стає простіше читати

Далі наведено приклад використання бази даних Код отримує курсор, інформація в якому відсортована по заголовку Це робиться шляхом виклику getJobs Потім відбувається ітерація процесу для кожної вакансії:

Розглянемо пояснення до коду

Створення обєкта Mi croJobsDatabase Аргумент this представляє контекст, як це було описано вище

Створення курсора JobsCursor, що використовує перерахування SortBy, розглянуте вище

Використання стандартних методів Cursor для ітерації через курсор

Все ще в рамках циклу викликається один із спеціальних методів, що надається JobsCursor для того, щоб «що-небудь зробити» на вибір користувача Метод буде викликаний для кожного значення стовпця title

Використання методу query

У той час як в додатках, що виконують нетривіальні операції з базами даних, корисно ізолювати пропозиції SQL, як було показано вище, для • додатків, які розраховані на прості операції з базами даних (наприклад, для нашого SimpleFinchVideoContentProvider), не менше корисно використовувати метод SQLiteDatabasequery Розглянемо наступний приклад, що відноситься до video:

Як і у випадку з SQLiteDatabaserawQueryWithFactory, показаним вище, обєкт Cursor є повертається значенням методу query Тут ми присвоюємо даний курсор змінної videoCursor, визначеної вище

Метод query застосовує команду SELECT до таблиці з заданим імям У нашому випадку імя таблиці зберігається в константі VIDEOTABLENAME Даний метод приймає два параметра По-перше, це проекція, де перераховуються стовпці, які тільки й Повинні відображатися в запиті, – значення інших стовпців не зявляться і в результатах курсора Багато додатків відмінно працюють, просто передаючи null замість проекції, і в такому випадку в результуючому курсорі відобразяться всі стовпці Далі, аргумент where містить умову SQL where без ключового слова WHERE Крім того, аргумент where може включати в себе ряд рядків ? , Які будуть замінюватися значеннями whereArgs При обговоренні методу execSQL ми більш детально поговоримо про те, як звязуються ці два значення

Зміна бази даних

Курсори Android відмінно підходять для зчитування інформації з бази даних, але в класі androiddatabaseCursor немає методів для створення, оновлення або видалення даних У класі SQLiteDatabase надається два базових API, які можна використовувати як для зчитування, так і для запису

Набір із чотирьох методів, званих іnsert, query, update і delete

Більш загальний метод execSQL, що приймає кожне окреме речення SQL, яке не займається поверненням даних, і застосовує цю пропозицію до бази даних

Рекомендуємо користуватися першими чотирма методами, коли потрібно виробляти однойменні їм операції (вставку, запит, оновлення і видалення) Ми покажемо вам обидва способи використання операцій в MJAndroid

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*