SimpleCursorAdapter — пример использования

| 11.07.2014

SimpleCursorAdapter позволяет легко и без лишнего кода вывести данные, полученные из базы данных, списком на экран. Создадим простое приложение, которое на старте создаст базу данных, заполнит ее несколькими строками и затем выведет в элемент ListView все эти данные.

Итак, нам понадобятся:

1. activity_main.xml — основной макет
2. item.xml — описание структуры отдельного элемента списка
3. Db.java — класс для работы с базой данных
4. MainActivity.java — класс активити со всей основной логикой

res/layout/activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
 
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>
 
</LinearLayout>

Тут все просто — корневой LinearLayout и один вложенный элемент ListView.

В ListView мы будем выводить построково выводить данные пользователей из базы. Каждый пункт списка будет включать в себя имя пользователя и его email. Соответственно, создадим два TextView в макете отдельного пункта.

res/layout/item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">
 
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
 
    <TextView
        android:id="@+id/tvEmail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="TextView" />
 
</LinearLayout>

Класс для работы с базой данных Db.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package ru.androiddocs.scursoradapter;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
 
public class Db {
 
    public static final String TABLE_NAME = "people";
 
    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_EMAIL = "email";
 
    private static final String DATABASE_NAME = "peopleDB";
    private static final int DATABASE_VERSION = 1;
    private static final String LOG_TAG = "my_tag";
 
    private DbHelper mDbHelper;
    private SQLiteDatabase mDb;
 
    public Db(Context context) {
        mDbHelper = new DbHelper(context);
    }
 
    public Cursor getAllItems() {
        mDb = mDbHelper.getReadableDatabase();
        return mDb.query(TABLE_NAME, null, null, null, null, null, null);					    
    }
 
    public void close() {
        if (mDbHelper != null) mDbHelper.close();
        if (mDb != null) mDb.close();					
    }
 
    public class DbHelper extends SQLiteOpenHelper {
 
        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {            	        
            db.execSQL("create table " + TABLE_NAME +" ("
                    + KEY_ID + " integer primary key autoincrement," 
                    + KEY_NAME + " text,"
                    + KEY_EMAIL + " text" + ");");
 
            ContentValues cv = new ContentValues(); 
 
            cv.put(KEY_NAME, "Igor"); 
            cv.put(KEY_EMAIL, "email1@email.com"); 
            db.insert(TABLE_NAME, null, cv);
 
            cv.put(KEY_NAME, "Dima"); 
            cv.put(KEY_EMAIL, "email2@email.com"); 
            db.insert(TABLE_NAME, null, cv);
 
            cv.put(KEY_NAME, "Alex"); 
            cv.put(KEY_EMAIL, "email3@email.com"); 
            db.insert(TABLE_NAME, null, cv);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    	
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);       
            this.onCreate(db);
        }
    }
}

Здесь тоже нет ничего сложного. При создании базы данных используется внутренний класс-помощник DbHelper, в котором имеется несколько методов для создания и обновления базы данных — onCreate и onUpgrade. В самом классе Db есть конструктор, метод для получения всех записей из таблицы в базе getAllItems() и метод close(), в котором мы закрываем все соединения и ресурсы.

Класс MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package ru.androiddocs.scursoradapter;
 
import ru.androiddocs.scursoradapter.Db;
 
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;
 
 
public class MainActivity extends ActionBarActivity {
 
    private Db mDbAdapter;
    private Cursor mCursor;
    private SimpleCursorAdapter mCursorAd;
    private ListView mLv;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mDbAdapter = new Db(this);		
        mCursor = mDbAdapter.getAllItems();
 
        String[] from = new String[] { Db.KEY_NAME, Db.KEY_EMAIL };
        int[] to = new int[] { R.id.tvName, R.id.tvEmail };
 
        mCursorAd = new SimpleCursorAdapter(this, R.layout.item, mCursor, from, to, 0);
        mLv = (ListView) findViewById(R.id.lv);
        mLv.setAdapter(mCursorAd);
 
        mDbAdapter.close();
    }	
}

В методе onCreate() подключаем layout, создаем экземпляр класса Db и вызываем метод getAllItems(), который возвращает нам объект типа Cursor.

Далее мы создаем экземпляр SimpleCursorAdapter, где в конструкторе передаем контекст (this), layout для отдельного пункта (R.layout.item), курсор, строковый массив from (в котором указываем колонки таблицы, из которых брать данные) и массив to, где указываем id элементов в layout, в которые помещать выбранные данные (в соответствующем from порядке). Последним параметром идет флаг, где мы укажем — 0 (сейчас не будем вдаваться в подробности, почитать можно здесь).

После создания адаптера «сеттим» его для элемента списка в layout. Вызываем метод close(), чтобы закрыть все ресурсы.

После запуска приложения получаем картинку:

SimpleCursorAdapter - пример использования

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*