Android Fundamentals: Tanggal Database dan Penyortiran
Indonesian (Bahasa Indonesia) translation by Riska Aprianti (you can also view the original English article)
Android menggunakan teknologi SQLite untuk database lokalnya. Ini bekerja dengan sangat baik. Namun, kebiasaan quirks kadang-kadang ada jika dibandingkan dengan database relasional berfitur lengkap. Salah satu Quirk seperti itu SQLite tidak mendukung jenis jenisnya. Untungnya, ini mendukung fungsi tanggal dan mampu menyimpan tanggal dalam berbagai format. Tutorial ini akan memberi Anda metode untuk bekerja dengan tanggal dalam konteks menambahkan tanggal ke database aplikasi "TutList" dan (akhirnya) menampilkan daftar tutorial, diurutkan berdasarkan tanggal.
Tutorial ini dibangun berdasarkan tutorial sebelumnya, termasuk SQLite Crash Course untuk Pengembang Android dan seri lanjutan pada aktivitas TutList kami dengan tutorial terbaru, Android Fundamentals: Bekerja dengan Penyedia Konten. Jika Anda kesulitan mengikutinya, jangan ragu untuk mengirim pertanyaan di bagian komentar -- banyak orang membaca dan merespons, termasuk kami. Juga, jangan lupa tentang referensi Android SDK.
Kode sampel akhir yang menyertai tutorial ini tersedia untuk diunduh sebagai sumber terbuka dari hosting kode Google.
Langkah 0: Memulai
Tutorial ini mengasumsikan Anda akan mulai dari tutorial sebelumnya dalam seri ini, Kompatibilitas Android: Daftar Indikator pada Honeycomb, tinggalkan. Anda dapat mengunduh kode itu dan bekerja dari sana atau Anda dapat mengunduh kode untuk tutorial ini dan mengikuti. Apa pun itu, bersiaplah dengan mengunduh satu atau proyek lain dan mengimpornya ke Eclipse.
Langkah 1: Memperbarui Database
Untuk menyimpan dan mengambil tanggal melalui penyedia konten, kita perlu memperbarui database aplikasi untuk menyimpan tanggal yang terkait dengan setiap catatan konten. Perubahan pada basis data berarti bahwa Anda perlu memperbarui versi basis data, menambahkan nama kolom baru sebagai konstanta, menyediakan skema awal baru, dan kode peningkatan ke basis data yang ada. Semua perubahan ini mempengaruhi class TutListDatabase.
Mulailah dengan memperbarui versi database ke 3.
private static final int DB_VERSION = 3;
Selanjutnya, tambahkan kolom baru untuk tanggal tersebut, tentukan nama kolom itu di Java.
public static final String COL_DATE = "tut_date";
Perbarui skema untuk memasukkan kolom baru.
private static final String CREATE_TABLE_TUTORIALS = "CREATE TABLE " + TABLE_TUTORIALS + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_TITLE + " TEXT NOT NULL, " + COL_URL + " text UNIQUE NOT NULL, " + COL_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now'))" + ");";
Kita telah memilih untuk menggunakan tipe INTEGER untuk menyimpan tanggal. Kita bisa memilih REAL, untuk menyimpan tanggal Julian, atau TEXT untuk menyimpan tanggal sebagai string. Kita menggunakan ekspresi SQLite, "strftime ('% s', 'now'))" yang menyisipkan waktu saat ini, dalam bentuk integer, ke dalam database. Nilainya dalam detik dan didefinisikan sebagai waktu Unix, detik sejak UTC dimulai pada tahun 1970.
Terakhir, tingkatkan skema yang lebih lama di dalam metode onUpgrade().
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion == 2 && newVersion == 3) { this value is mid february 2011 db.execSQL("alter table "+ TABLE_TUTORIALS + " add column " + COL_DATE + " INTEGER NOT NULL DEFAULT '1297728000' "); } else { Log.w(DEBUG_TAG, "Upgrading database. Existing contents will be lost. [" + oldVersion + "]->[" + newVersion + "]"); db.execSQL("DROP TABLE IF EXISTS " + TABLE_TUTORIALS); onCreate(db); } }
Perhatikan di sini bahwa skema yang diubah bervariasi dari skema asli. SQLite tidak mengizinkan ekspresi atau nilai tanggal saat ini digunakan sebagai nilai default saat mengubah tabel. Menggunakan nilai konstan (kita memilih pertengahan Februari tahun ini) adalah satu-satunya pilihan pendek membuat tabel baru dan menyalin data di seluruh -- operasi yang mahal ketika ada sejumlah besar data. Lihat dokumentasi SQLite pada ALTER TABLE untuk informasi lebih lanjut tentang batasan dengan operasi ADD COLUMN. Ingatlah batasan ini ketika merancang skema database aplikasi Anda dan merencanakan perubahan atau peningkatan di lain waktu.
Ini melengkapi perubahan database yang diperlukan untuk mendukung data tanggal artikel. Ini akan memungkinkan memperbarui aplikasi yang lebih lama tanpa kehilangan data apa pun yang sudah diunduh. Meskipun hal ini mungkin tidak berguna pada aplikasi ini, melakukan hal ini dengan benar dan membiasakan melakukannya akan menghemat masalah nantinya. Plus, pengguna Anda akan lebih senang.
Langkah 2: Memperbarui Penyedia Konten
Saat memperbarui aplikasi database, Anda ingin meninjau penyedia konten Anda untuk melihat perubahan apa yang harus dilakukan untuk membuat keduanya seimbang. Dalam hal ini, tidak ada perubahan yang diperlukan. Kita hanya menambahkan kolom baru untuk tanggal tersebut, yang tidak perlu dicerminkan dalam jenis URI atau modifikasi permintaan lainnya di penyedia konten.
Langkah mudah, ya? Ini tidak selalu mudah, karena Anda akan melihat lain kali kita menjalani latihan ini.
Langkah 3: Memperbarui Parser
Di dalam class TutListDownloaderService, kita menggunakan Pull Parser untuk mengambil data dari umpan XML dan memasukkannya ke dalam database. Kita perlu mendapatkan tanggal dari umpan, mentransformasikannya ke format yang sesuai untuk database, dan kemudian menambahkannya sebagai bagian dari setiap catatan database.
Dalam metode xmlParse(), tambahkan cek berikut dalam rantai pemeriksaan untuk event START_TAG:
if (tutorials.getName().equals("pubDate")) { tutorials.next(); DateFormat parser = new SimpleDateFormat("E, dd MMM yyyy"); try { Date date = parser.parse(tutorials.getText()); tutorialData.put(TutListDatabase.COL_DATE, date.getTime() / 1000); } catch (ParseException e) { Log.e(DEBUG_TAG, "Error parsing date: " + tutorials.getText()); } }
Berikut ini contoh tampilan tanggal di XML:
<pubDate>Fri, 20 May 2011 11:30:23 +0000</pubDate>
Karena kita hanya tertarik pada tanggal, kita menguraikan ini menggunakan class SimpleDateFormat. Setelah metode parse() dipanggil, kita memiliki objek Tanggal standar. Karena objek Date menyimpan nilai sebagai milidetik alih-alih detik, kita kemudian membaginya dengan 1000 sebelum menyimpan hasilnya ke dalam database.
Langkah 4: Memodifikasi Layout ListView
Tanggal perlu ditampilkan di ListView bersama dengan judul setiap artikel. Saat ini, resource layout list_item.xml berisi satu TextView. Sekarang, ubah layout ini untuk menggunakan LinearLayout (berorientasi vertikal) untuk menempatkan judul di atas tanggal. Berikut daftar file list_item.xml yang diperbarui.
<?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="vertical"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24dp" android:padding="6dp" /> <TextView android:id="@+id/date" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18dp" android:padding="4dp" android:gravity="right" /> </LinearLayout>
Jangan lupa untuk membuat perubahan ini ke list_item.xml alternatif yang ditemukan di direktori / layout-v11 juga.
Langkah 5: Memperbarui Fragmen ListView
Di dalam class TutListFragment, beberapa perubahan harus dilakukan untuk menambahkan dukungan penyortiran ke kontrol ListView. Proyeksi kursor harus diperbarui untuk memasukkan kolom tanggal. Nilai-nilai yang mengikat untuk adaptor harus diperbarui untuk menambahkan data tanggal juga, dan objek baru TextView yang akan menampilkan tanggal harus dikonfigurasi. Akhirnya, kelas ViewBinder khusus harus ditambahkan, jika tidak tanggal yang ditampilkan tidak akan terlihat benar.
Mulailah dengan memperbarui proyeksi kursor dan menambahkan klausa pengurutan, dalam metode onCreateLoader(), seperti ini:
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String[] projection = { TutListDatabase.ID, TutListDatabase.COL_TITLE, TutListDatabase.COL_DATE }; Uri content = TutListProvider.CONTENT_URI; CursorLoader cursorLoader = new CursorLoader(getActivity(), content , projection, null, null, TutListDatabase.COL_DATE+" desc"); return cursorLoader; }
Urutan tanggal yang menurun berarti item terbaru akan muncul di bagian atas.
Selanjutnya, ubah variabel binding (sekarang ditemukan di tingkat class) yang digunakan oleh class SimpleCursorAdapter, seperti ini:
private static final String[] UI_BINDING_FROM = { TutListDatabase.COL_TITLE, TutListDatabase.COL_DATE }; private static final int[] UI_BINDING_TO = { R.id.title, R.id.date };
Pada titik ini, kode harus berfungsi. Namun, hasilnya akan terlihat seperti ini:



Informasi tanggal baku, walaupun diurutkan dengan benar, tidak sangat berguna untuk kebanyakan pengguna. Solusinya adalah untuk mengubah nilai baku kembali ke tanggal ditampilkan menggunakan pengguna lokal. Untuk melakukan ini, kita dapat menerapkan sebuah objek ViewBinder.
Langkah 6: Menerapkan ViewBinder
Karena kita menggunakan objek SimpleCursorAdapter, kita akan menerapkan class SimpleCursorAdapter.ViewBinder custom. Kelas ViewBinder memungkinkan untuk pemetaan custom kolom ke objek View-nya sebagaimana diidentifikasi melalui array binder yang disediakan. Ini berarti kita dapat mengubah apa yang terjadi selama pengikatan kolom tanggal ke objek TextView tanpa mengganggu ikatan lainnya. Berikut adalah contoh implementasi custom ViewBinder yang melakukan ini:
private class TutorialViewBinder implements SimpleCursorAdapter.ViewBinder { @Override public boolean setViewValue(View view, Cursor cursor, int index) { if (index == cursor.getColumnIndex(TutListDatabase.COL_DATE)) { // get a locale based string for the date DateFormat formatter = android.text.format.DateFormat .getDateFormat(getActivity().getApplicationContext()); long date = cursor.getLong(index); Date dateObj = new Date(date * 1000); ((TextView) view).setText(formatter.format(dateObj)); return true; } else { return false; } } }
Parameter yang masuk ke metode tunggal yang perlu kita terapkan, setViewValue, adalah objek View dari array UI_BINDING_TO yang kita sediakan, objek Kursor yang digunakan adaptor, dan indeks data yang ditemukan dalam kursor.
Kita menggunakan indeks dan objek Kursor untuk menentukan apakah nilai yang diikat adalah tanggal. Jika tidak, false dikembalikan untuk menunjukkan bahwa pengikatan default harus dilakukan. Jika demikian, kita melanjutkan dengan memformat ulang tanggal. Menggunakan class android.text.format.DateFormat memungkinkan kita untuk mengambil objek DateFormat khusus lokal. Karena nilai yang disimpan dalam database adalah dalam hitungan detik, kita harus mengonversinya menjadi milidetik. Kemudian kita dapat memanggil setText() pada tampilan untuk menulis string yang dihasilkan.
Akhirnya, class ViewBinder ini harus ditetapkan ke adaptor. Tepat setelah adaptor diinisialisasi, dalam metode onCreate(), panggil metode setViewBinder():
adapter.setViewBinder(new TutorialViewBinder());
Sekarang ketika Anda menjalankan aplikasi, tanggal akan muncul dalam format khusus untuk pengguna lokal (atau format tanggal yang Anda atur di Pengaturan).



Kesimpulan
Dalam tutorial ini, Anda telah belajar cara bekerja dengan tanggal di Android saat membacanya dari feed XML, dan membaca dan menulisnya ke database SQLite. Selain itu, Anda belajar cara membuat perubahan khusus pada nilai individual yang ditampilkan dalam ListView. Dalam konteks TutList, Anda telah memodifikasi aplikasi untuk menyimpan tanggal sebagai diuraikan dari feed XML tutorial dan menggunakan tanggal tersebut untuk menunjukkan tutorial terbaru kepada pengguna dalam urutan publikasi.
Seperti biasa, kami menantikan tanggapan Anda!
Tentang Penulis
Pengembang seluler Lauren Darcey dan Shane Conder telah ikut menulis beberapa buku tentang pengembangan Android: buku pemrograman mendalam berjudul Pengembangan Aplikasi Nirkabel Android dan Pengembangan Aplikasi Android Sams Teach Yourself dalam 24 Jam. Ketika tidak menulis, mereka menghabiskan waktu mengembangkan perangkat lunak seluler di perusahaan mereka dan menyediakan layanan konsultasi. Mereka dapat dihubungi melalui email ke androidwirelessdev+mt@gmail.com, melalui blog mereka di androidbook.blogspot.com, dan di Twitter @androidwireless.