суббота, 11 сентября 2010 г.

Хранение данных в Android


В прошлом своем посте я писал о создании всплывающих менюшек, сегодня же мы поговорим о более важной теме такой, как хранение данных.В 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, требуется программист и дизайнер.

9 комментариев:

  1. тема интересная но меня интересует больше как сделать связь между таблицами. например есть таблица городов и есть таблица адресов, город может иметь 10 адресов но адрес только один город. как такое сделать?

    ОтветитьУдалить
  2. а как бы вы такое сделали не на мобильной платформе?

    ОтветитьУдалить
  3. Добрый день!

    Забил все это в свое приложение. Сохраняет или нет проверить не могу и в связи с этим стараюсь проверить при помощи кода приведенного ниже:

    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.

    Где я мог напортачить?

    ОтветитьУдалить
  4. Вот меня интересует как получить список контактов,мне нужно только имя и номер,но при этом каждый параметр в отдельном массиве, я долго ломал голову,да и запутано все тк есть различия в структуре бд версии 1.6 и 2.0,мне нужно именно 2.0.

    ОтветитьУдалить
  5. Немного непонятно, зачем при каждом клике на кнопку создавать новый экземпляр DbOpenHelper. Или это было сделано для облегчения примера?
    nsabuhi, могу вам помочь с этим. Был прецендент)

    ОтветитьУдалить
  6. автор, отпишись пожалуйста на rusdredd@gmail.com
    помощь нужна

    ОтветитьУдалить
  7. @ nsabuhi: Мужик попробуй использовать projection, и в конце концов почитайте документацию по андроиду, там очень понятно написано как доставать контакты и не только. Для этого не нужно писать свой ДБхелпер.

    ОтветитьУдалить
  8. Интересно, кто то решал проблему GUID как ключевого поля? Мне сейчас проект переносить с винмобайл на андроид и тут такая засада, ключевое поле обязательно типа INT

    ОтветитьУдалить