Meningkatkan Performa SQL Query di Windows Phone

Pada tutorial sebelumnya, saya menjelaskan bagaimana cara menggunakan database SQLite pada app Windows Phone. Di tutorial tersebut saya melakukan copy file database dari “Package.Current.InstalledLocation” ke “ApplicationData.Current.LocalFolder”. Mengapa langkah ini diperlukan?

Ketika menambahkan external file pada Windows Phone project, biasanya developer memilih “Content” pada property “Build Action” dan “Copy always” pada property “Copy to Output Directory”. Dengan pilihan ini berarti external file tersebut akan di-copy ke dalam app package dan di-compress untuk mengurangi ukuran file yang harus di-download oleh pengguna di Windows Store. Hal ini mengakibatkan setiap kali ada query yang dijalankan, file database harus di-decompress terlebih dahulu sehingga dapat memakan waktu lama, apalagi jika ukuran file database sangat besar.

Solusi lain yang dapat dipilih adalah menggunakan pilihan property “Build Action” > “Embedded Resource”. Namun ini berarti ukuran file di Windows Store akan menjadi sangat besar karena file database tidak di-compress. Go green, save internet quota.

Dengan melakukan copy dari InstalledLocation ke LocalFolder, kita sudah melakukan decompress sebelum menjalankan query. Terlebih lagi, LocalFolder adalah persistent storage yang berarti file hasil decompress tersebut akan tetap ada meskipun app sudah ditutup dan dibuka kembali. Jangan lupa juga untuk selalu menambahkan index pada database. Dengan menggunakan database file di LocalFolder dan indexing yang tepat, performa SQL query akan meningkat tajam.

App Release: Alkitab Mobile

Alkitab Mobile

Meskipun sepi pengguna, Windows Phone tetap menjadi pilihan bagi sebagian orang. Saya sendiri menggunakan Windows Phone karena ketahanan baterai yang sangat baik (Microsoft Lumia 640XL), kemudahan integrasi dengan berbagai layanan Microsoft, dan desain elegan. Kendala terbesar dalam menggunakan Windows Phone adalah keterbatasan app di Windows Store. Bila Anda menggunakan Windows Phone untuk kepentingan non-bisnis, biasanya akan kesulitan mendapatkan app yang sesuai kebutuhan.

Mengapa app Alkitab? Karena di era yang serba digital ini orang-orang sudah tidak mau repot membawa media cetak (penjelasan yang sangat mainstream). Saya sudah mencoba beberapa app Alkitab di Windows Phone, tetapi selalu terbentur tiga masalah berikut: tidak tersedia versi Bahasa Indonesia, terdapat banyak bug pada app, atau desain tidak user-friendly. Untuk menghemat umur, saya putuskan untuk membuat app Alkitab sendiri.

Fitur-fitur yang dimiliki Alkitab Mobile:

  • Omnibox, kombinasi navigasi Alkitab dan pencarian ayat dengan fitur auto-complete. Lebih mudah digunakan dibanding combobox tradisional yang mengharuskan pengguna melakukan scroll untuk mencari kitab, pasal, dan ayat. Contoh: ketik “Kej 1:1” di Omnibox untuk menuju ke Kejadian pasal 1 ayat 1, ketik “Musa dan Harun” untuk menuju ayat yang mengandung kata tersebut.
  • Tombol navigasi pasal (next dan previous). Dengan menggunakan tombol navigasi, lebih mudah menuju pasal selanjutnya atau kembali ke pasal sebelumnya dibanding harus kembali melakukan pencarian.
  • Desain minimalis dan optimal untuk membaca. Layar Anda tidak lagi dipenuhi dengan tombol-tombol ataupun menu yang tidak Anda gunakan.
  • Pilihan ukuran font dan bahasa. Ubah ukuran font ke ukuran yang paling nyaman untuk mata Anda. Saat ini tersedia pilihan Bahasa Indonesia (Indonesia Terjemahan Baru) dan English (King James Version). Pilihan bahasa lain akan ditambahkan di update yang akan datang.

Detail lebih lanjut dan screenshot dapat dilihat di Windows Store. Tinggalkan kritik dan saran di halaman review Windows Store atau komentar di post ini.
Download from Windows Store

Menghubungkan Windows Phone 8.1 App dan SQLite

Karena bosan dengan web development, saya mencoba untuk mengembangkan sebuah aplikasi untuk Windows Phone 8.1 menggunakan Visual Studio Express 2015. Salah satu permasalahan terbesar yang saya temukan adalah Windows Phone 8.1 ternyata secara resmi sudah berhenti mendukung penggunaan database SQL Server CE (Compact Edition) yang umum digunakan pada versi pendahulunya (WP 8 dan WP 7). Lebih buruk lagi, dukungan resmi terhadap SQLite pun tidak ada, sehingga hanya meninggalkan pilihan plaintext file untuk penyimpanan data.

Namun sepertinya saya diselamatkan oleh sebuah library yang dibuat Frank Krueger yaitu sqlite-net yang memungkinkan penggunaan SQLite sebagai database app Windows Phone. Cara instalasi sqlite-net:

  1. Buka Tools (alt+T) > NuGet Package Manager > Package Manager Console
  2. Pada console, jalankan baris berikut
    Install-Package sqlite-net
  3. Pada Solution Explorer, klik kanan References > Add Reference
  4. Pada menu kiri, pilih Windows Phone 8.1 > Extensions, pastikan SQLite for “Windows Phone 8.1” dalam status aktif
  5. Perhatikan pada Solution Explorer, akan ada 2 file baru yaitu SQLite.cs dan SQLiteAsync.cs

Kali ini kita akan menggunakan SQLite.cs sebagai penghubung app dengan SQLite, penggunaan fungsi-fungsi async (asynchronous) akan dijelaskan di kesempatan lain. Sebelum dapat menggunakan database SQLite, lakukan langkah-langkah berikut:

  1. Persiapkan file database SQLite yang akan digunakan (contoh: db.sqlite)
  2. Buat folder baru di bawah project Anda (contoh: DB)
  3. Klik kanan folder yang baru dibuat, Add > Existing Item, arahkan pada file SQLite Anda
  4. Klik kanan file db.sqlite di Solution Explorer > Properties
  5. Pada panel properties pastikan “Build Action” berisi “Content” dan “Copy to Output Directory” berisi”Copy always”
  6. Salin code berikut pada class yang akan menggunakan koneksi database
    public static async void copyDatabase()
    {
    bool isDatabaseExisting = false;
    try
    {
    StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync("db.sqlite");
    isDatabaseExisting = true;
    }
    catch
    {
    isDatabaseExisting = false;
    if (!isDatabaseExisting)
    {
    StorageFile databaseFile = await Package.Current.InstalledLocation.GetFileAsync("DB\\db.sqlite");
    await databaseFile.CopyAsync(ApplicationData.Current.LocalFolder);
    }
    }

    public static SQLiteConnection getConnection()
    {
    return new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "db.sqlite"));
    }
  7. Pastikan copyDatabase() dipanggil sebelum menggunakan database
  8. Untuk mendapatkan suatu tabel, buatlah entity class untuk tabel tersebut, misalnya users
  9. Gunakan pemanggilan seperti berikut, dilanjutkan dengan query yang diinginkan (Where, GroupBy, …)
    getConnection().Table<users>().Where(...)