Автор: Пользователь скрыл имя, 24 Октября 2013 в 09:18, курсовая работа
Целью данного курсового проекта является изучение ОС Android и получения навыков программирования для этой системы, а так же работы с базами данных этой системы. В настоящее время в связи с широким распространением данной операционной мобильной системы растет востребованность к приложениям различной направленности. В связи с этим данная тема очень актуальна, так как в ней будут изложены и разобраны сведения, которые помогут разобраться во многих аспектах системы Android.
Введение……………………………………………………………………………2
Введение в Android……………………………………………….……….......3
. История создания ОС………………………………………..……….…...3
1.2. Основные сведения о системе Android…………………….…..….…….4
1.3. Базовые компоненты Android…………………………………….....…...6
2. Разработка приложений для Android……………………………..…….…….7
2.1. Основные виды приложений……………………………………….……7
2.2. Изучение структуры приложения на основе программы To-Do-List.…8
2.3. Файл AndroidManifest.xml………………………………………………..11
2.3.1. Описание файла…………………………………………..………11
2.3.2. Конфигурирование основных настроек файла…………………12
2.4. Класс Application в Android……………………………………………..14
2.5. Активности в Android……………………………………………………16
3. Работа с базами данных и источниками данных…………………………..19
3.1. Базы данных SQLite……………………………………………………..19
3.1.1. Вставка, удаление и обновление строк в таблицах SQLite……24
3.2. Источники данных Android и работа с ними………………………….25
3.2.1. Основные сведения и создание источника данных……………25
3.2.2. Использование источников данных…………………………….28
Заключение……………………………………………………………………….31
Литература………………………………………………………………………..32
Нужно создавать Активности для каждого экрана, который хотите отобразить. Как минимум необходимо создать Активность для начального экрана, который отвечает за работу основного пользовательского интерфейса приложения. Такой интерфейс часто дополняется второстепенными Активностями, предназначенными для ввода информации, ее вывода, предоставления дополнительных возможностей. Запуск новой Активности (или возврат из нее) инициирует перемещение между экранами. Большинство Активностей проектируются таким образом, чтобы занимать весь экран, но возможно создавать полупрозрачные или плавающие диалоговые окна.
При создании Активности необходимо наследовать класс Activity. Внутри этого класса нужно определить пользовательский интерфейс и реализовать нужную функциональность.
package com.paad.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MyActivity extends Activity {
/** Вызывается при первом создании Активности. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(
}
}
Базовый класс Activity представляет собой пустой экран, который инкапсулирует всю работу по отображению окна. Пустая Активность не особо
нужна, поэтому первое, что необходимо сделать, — создать пользовательский интерфейс с помощью Представлений и разметки.
Представления — элементы управления, которые отображают данные и обеспечивают взаимодействие с пользователем. Android предоставляет несколько классов разметки, наследников ViewGroup, которые могут содержать Представления для проектирования пользовательских интерфейсов.
Чтобы назначить пользовательский интерфейс для Активности, внутри обработчика onCreate необходимо вызвать метод setContentView, принадлежащий объекту Activity.
В этом первом фрагменте в качестве пользовательского интерфейса для
Активности выступает элемент TextView:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(
TextView textView = new TextView(this);
setContentView(textView);}
Возможно создавать разметку в коде программы и используя объекты
ViewGroup, и с помощью внешних ресурсов, передавая соответствующий
идентификатор. Этот стандартный для Android подход показан в следующем примере:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(
setContentView(R.layout.main);
}
Чтобы использовать Активность в своем приложении, необходимо зарегистрировать ее в манифесте, т.е. добавить новый тег <activity> внутри узла <application>. Данный тег включает атрибуты для хранения метаинформации: метку, значок, необходимые полномочия и визуальные темы, используемые Активностью. Без соответствующего тега <activity> Активность не может быть выведена на экран.
Также Внутри тега <activity> можно добавлять узлы <intent-filter>, описывающие Намерения, которые Активность станет отслеживать для дальнейшего взаимодействия. Каждый Фильтр намерений определяет одно или несколько действий и категорий, которые поддерживаются Активностью.
<activity android:label="@string/app_
android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.
<category android:name="android.intent.
</intent-filter>
</activity>
Структурированные данные в Android хранятся с использованием двух механизмов:
3.1. Базы данных SQLite
SQLite — это система управления реляционными базами данных, которая хорошо себя зарекомендовала. Свободная, одноуровневая, соответствующая стандартам система управления. С помощью SQLite можно создавать для своего приложения независимые реляционные базы данных и использовать их для хранения и управления сложными, структурированными данными приложения.
Android хранит базы данных в
каталоге /data/data/<имя_
Поскольку SQLite реализована в виде библиотеки, а не как отдельный исполняемый процесс, каждая база данных считается частью приложения, которое ее создало. Благодаря этому минимизируется число внешних зависимостей, уменьшаются задержки, упрощаются синхронизация и блокирование при выполнении транзакций. К тому же SQLite отличается отсутствием типизации каждого столбца. Это значит, что значения в столбце не обязаны иметь один и тот же тип. Вместо этого каждое значение типизируется отдельно для каждой строки. В связи с этим нет необходимости проверять типы при занесении или извлечении данных в контексте каждого столбца в строке.
Для добавления строк в таблицу используется класс ContentValues. Каждый объект этого класса представляет собой одну строку таблицы и выглядит как ассоциативный массив с именами столбцов и значениями, которые им соответствуют.
В Android запросы к базе данных возвращают объекты класса Cursor. Вместо того чтобы извлекать данные и возвращать копию значений, Cursor ссылаются на результирующий набор исходных данных. Курсоры позволяют управлять текущей позицией (строкой) в результирующем наборе данных, возвращаемом при запросе.
Класс Cursor имеет много возможностей для навигации:
Android предоставляет удобный
Чтобы извлечь значения из результирующего Курсора, сперва необходимо воспользоваться методами moveTo<местоположение>, чтобы поставить Cursor в правильную строку. Далее необходимо использовать типизированные методы get<тип> (передавая им индексы столбцов), чтобы вернуть значение, хранимое в текущей строке для указанного столбца, как показано в следующем фрагменте:
String columnValue = myResult.getString(
Для того тобы выполнить запрос к базе данных, необходимо использовать метод query, передавая ему:
• необязательное значение типа Boolean, которое определяет, должен ли результирующий набор данных содержать исключительно уникальные значения;
• имя базы данных, к которой нужно получить доступ;
• проекцию в виде массива строк, содержащего список столбцов, которые нужно включить в результирующий набор;
• оператор WHERE, определяющий те строки, что должны быть возвращены
• массив строк, выступающих в роли аргументов для оператора SELECT, которые заменят маски ≪?≫ в операторе WHERE;
• оператор GROUP BY, который определяет, каким образом будут сгруппированы результирующие строки;
• фильтр HAVING, который определяет, какие группы строк включать в результат, если использовался оператор GROUP BY;
• строку, описывающую порядок возвращения результирующих строк;
• необязательный строковой параметр, определяющий максимальное количество возвращаемых строк.
Для упрощения работы с базой данных можно создать вспомогательный класс.
Этот класс называется Адаптер - абстрактная прослойка которая инкапсулирует взаимодействия с базой данных. Он предоставляет интуитивный, строго типизированный способ добавления, удаления и изменения элементов. Адаптер базы данных также должен обрабатывать запросы и переопределять методы для создания, открытия и закрытия базы данных. Он также может использоваться как удобное место для размещения статических констант, относящихся к базе данных (например, имен таблиц и столбцов).
import android.content.Context;
import android.database.*;
import android.database.sqlite.*;
import android.database.sqlite.
import android.util.Log;
public class MyDBAdapter {
private static final String DATABASE_NAME = "myDatabase.db";
private static final String DATABASE_TABLE = "mainTable";
private static final int DATABASE_VERSION = 1;
// Индекс (ключ) столбца, с которым мы будем работать.
public static final String KEY_ID="_id";
// Имя и индекс каждого столбца в вашей базе данных.
public static final String KEY_NAME="name";
public static final int NAME_COLUMN = 1;
// TODO: Создать публичное поле для каждого столбца в вашей базе данных.
// Инструкция на языке SQL для создания новой базы данных.
private static final String DATABASE_CREATE = "create table " +
DATABASE_TABLE + " (" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME + " text not null);";
// Поле, хранящее экземпляр базы данных.
private SQLiteDatabase db;
// Объект Context приложения,
которое использует базу
private final Context context;
// Вспомогательный класс для открытия/обновления базы данных.
private myDbHelper dbHelper;
public MyDBAdapter(Context _context) {
context = _context;
dbHelper = new myDbHelper(context, DATABASE_NAME,
}
public MyDBAdapter open() throws SQLException {
db = dbHelper.getWritableDatabase()
return this;
}
public void close() {
db.close();
}
public int insertEntry(MyObject _myObject) {
// TODO: Создать новый объект ContentValues для представления нашей
// строки и вставить его в базу данных.
return index;
}
public boolean removeEntry(long _rowIndex) {
return db.delete(DATABASE_TABLE, KEY_ID + "=" + _rowIndex, null) > 0;
}
public Cursor getAllEntries () {
return db.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_NAME},
null, null, null, null, null);
}
public MyObject getEntry(long _rowIndex) {
// TODO: Возвратить курсор, ссылающийся на строку из базы данных,
// и использовать значения
для заполнения данными
MyObject.return objectInstance;
}
public boolean updateEntry(long _rowIndex, MyObject _myObject) {
// TODO: Создать экземпляр класса ContentValues, основанный на новом
// объекте, и использовать его для обновления строки в базе данных.
return true;
}
private static class myDbHelper extends SQLiteOpenHelper {
public myDbHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
// Вызывается, когда база данных не найдена на носителе,
// и вспомогательный класс должен создать новую.
@Override
public void onCreate(SQLiteDatabase _db) {
_db.execSQL(DATABASE_CREATE);}
// Вызывается при несоответствии версии базы данных, в следствие чего
// версия базы данных
на носителе нуждается в
@Override
public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _
newVersion) {
// Логируйте обновление версии.
Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion
+ " to " +_newVersion + ", which will destroy all old data");
// Приведите существующую базу данных в соответствие с новой
// версией. Все предыдущие версии могут быть обработаны путем
// сравнения значений _oldVersion и _newVersion.
// Самый простой способ - удалить старую таблицу и создать новую.
_db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
// Create a new one.
onCreate(_db);
}
}
}
Здесь написан каркас для класса, реализующего стандартный Адаптер базы данных. В нем происходит наследование класса SQLiteOpenHelper, который нужен для упрощения открытия, создания и обновления базы данных.
SQLiteOpenHelper — абстрактный класс,
предназначенный для
В листинге выше показано как наследовать класс SQLiteOpenHelper, переопределив конструктор, а также методы onCreate и onUpgrade, чтобы контролировать создание новой базы данных и обновление ее до последней версии соответственно.
Чтобы использовать реализацию вспомогательного класса, необходимо создать новый экземпляр, передать его конструктору контекст, имя базы данных, текущую версию и объект класса CursorFactory (если он используется).
Можно вызвать метод getReadableDatabase или getWritableDatabase, чтобы открыть и вернуть экземпляр базы данных, с которой мы имеем дело (он будет доступен как для чтения, так и для записи). Вызов метода getWritableDatabase может завершиться неудачно из-за проблем с полномочиями или нехваткой места на диске, поэтому лучше предусмотреть откат к методу getReadableDatabase
Использование SQLiteOpenHelper для доступа к базе данных:
dbHelper = new myDbHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
SQLiteDatabase db;
try {
db = dbHelper.getWritableDatabase()
}
catch (SQLiteException ex){
db = dbHelper.getReadableDatabase()
}
Внутри скрыта следующая логика:
если база данных не существует, вспомогательный
класс вызывает свой обработчик onCreate; если версия базы данных изменилась,
вызовется обработчик onUpgrade. В любом случае вызов методов getWritableDatabase/
Так же возможно открывать и создавать базы данных без помощи класса SQLiteHelper, используя метод openOrCreateDatabase, принадлежащий объекту Context вашего приложения.
3.1.1. Вставка, удаление и обновление строк в таблицах SQLite
Класс SQLiteDatabase предоставляет методы insert, delete и update, которые инкапсулируют операторы языка SQL, необходимые для данных действий. Кроме того, метод execSQL позволяет выполнять любой допустимый код на языке SQL применимо к таблицам базы данных.
Каждый раз, когда нужно отредактировать очередное значение из базы данных, нужно вызывать метод refreshQuery для всех Курсоров, которые имеют отношение к редактируемой таблице.
Информация о работе Основы создания приложений и работы с базами данных мобильной системы android