В прошлом своем посте я писал о создании всплывающих менюшек, сегодня же мы поговорим о более важной теме такой, как хранение данных.В android есть несколько способов хранения данных: общие настройки, бд и тд. В этом посте я расскажу о том как хранить данные в БД.
В качестве БД android использует встраиваемую SQLite. SQLite очень быстрая база,поэтому ее использование на мобильной платформе не приводит к резкому уменьшению производительности. Перейдем к описанию кода. Гугл позаботился о наших нервах и написал небольшой класс утилиту SQLiteOpenHelper.
public class DbOpenHelper extends SQLiteOpenHelper{
private static final int DB_VERSION = 1;
private static final String DB_NAME = "test";
public static final String TABLE_NAME = "users";
public static final String LOGIN = "login";
public static final String PASSW = "passw";
private static final String CREATE_TABLE = "create table " + TABLE_NAME + " ( _id integer primary key autoincrement, "
+ LOGIN + " TEXT, " + PASSW + " TEXT)";
public DbOpenHelper(Context context) {
super(context, DB_NAME, null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
При создании экземпляра класса DbOpenHelper будет проверено, существует ли база с именем test, если существует, то будет вызван метод onUpgrade, если нет то onCreate в котором мы создаем таблицу users(обычно в этом методе создают таблицы и инициализируют их значениями по умолчанию). У класса SQLiteOpenHelper есть методы getReadableDatabase и getWritableDatabase, которые возвращают экземпляр класса SQLiteDatabase. С помощью этого экземпляра мы и будет работать с БД. У него есть все нужные нам методы: insert, update, query, delete и тд.
Напишем небольшое приложение сохраняющее логин и пароль в базу
public class TestActivity extends Activity {
EditText loginEditText = null;
EditText passEditText = null;
Button saveButton = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
loginEditText = (EditText) findViewById(R.id.login);
passEditText = (EditText) findViewById(R.id.passw);
saveButton = (Button) findViewById(R.id.btn1);
saveButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
DbOpenHelper dbOpenHelper = new DbOpenHelper(TestActivity.this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DbOpenHelper.LOGIN,loginEditText.getText().toString());
cv.put(DbOpenHelper.PASSW,passEditText.getText().toString());
db.insert(DbOpenHelper.TABLE_NAME,null,cv);
db.close();
loginEditText.setText("");
passEditText.setText("");
}
});
}
}
В примере у нас есть окно в котором два поля ввода и кнопка, а по нажатию кнопки происходит сохранение. Вначале мы создаем экземляр класса DbOpenHelper, который создает саму базу и таблицы. Затем получаем объект SQLiteDatabase, методом insert которого будет происходить запись. ContentValues это некая обертка над данными, которые будут записаны в бд. В методе put первым аргументом является имя столбца, а вторым сами данные которые будут записаны в столбец,на языке SQL это выглядит так:
INSERT INTO users ( 'login','passw') VALUES ('somelogin','somepass')
В качестве домашнего задания,попробуйте доставать из бд данные и отображать их на экране.
Исходники проекта можно скачать тут.
Отвечу на вопросы в комментах.
P.S. Хочу начать большой проект под android, требуется программист и дизайнер.
тема интересная но меня интересует больше как сделать связь между таблицами. например есть таблица городов и есть таблица адресов, город может иметь 10 адресов но адрес только один город. как такое сделать?
ОтветитьУдалитьа как бы вы такое сделали не на мобильной платформе?
ОтветитьУдалитьИндексы добавить в БД
ОтветитьУдалитьДобрый день!
ОтветитьУдалитьЗабил все это в свое приложение. Сохраняет или нет проверить не могу и в связи с этим стараюсь проверить при помощи кода приведенного ниже:
public void onCreate(Bundle savedInstanceState)
{
int Val;
super.onCreate(savedInstanceState);
setContentView(R.layout.magicsquare);
mButton = (Button) findViewById(R.id.Button_Calcular);
mButton.setOnClickListener(this);
mNombre = (TextView) findViewById(R.id.Nombre);
DbOpenHelper dbOpenHelper = new DbOpenHelper(magicsquare.this);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
ContentValues cv = new ContentValues();
Val=cv.size();
mNombre.setText(String.valueOf(Val));
db.close();
}
В итоге на выходе получаю устойчивый 0.
Где я мог напортачить?
Вот меня интересует как получить список контактов,мне нужно только имя и номер,но при этом каждый параметр в отдельном массиве, я долго ломал голову,да и запутано все тк есть различия в структуре бд версии 1.6 и 2.0,мне нужно именно 2.0.
ОтветитьУдалитьНемного непонятно, зачем при каждом клике на кнопку создавать новый экземпляр DbOpenHelper. Или это было сделано для облегчения примера?
ОтветитьУдалитьnsabuhi, могу вам помочь с этим. Был прецендент)
автор, отпишись пожалуйста на rusdredd@gmail.com
ОтветитьУдалитьпомощь нужна
@ nsabuhi: Мужик попробуй использовать projection, и в конце концов почитайте документацию по андроиду, там очень понятно написано как доставать контакты и не только. Для этого не нужно писать свой ДБхелпер.
ОтветитьУдалитьИнтересно, кто то решал проблему GUID как ключевого поля? Мне сейчас проект переносить с винмобайл на андроид и тут такая засада, ключевое поле обязательно типа INT
ОтветитьУдалить