Minggu, September 30, 2018

Dasar Android : Menyimpan Data

Menyimpan Data

Materi:
Android menyediakan sejumlah opsi bagi Anda untuk menyimpan data aplikasi yang persisten. Solusi yang dipilih bergantung pada kebutuhan khusus Anda, misalnya apakah data harus bersifat privat untuk aplikasi Anda atau bisa diakses oleh aplikasi lainnya (dan pengguna) serta berapa banyak ruang yang diperlukan data.
Opsi storage data Anda adalah seperti berikut:
  • Preferensi bersama—Menyimpan data primitif pribadi dalam pasangan nilai-kunci Hal ini akan dibahas di bab berikutnya.
  • Penyimpanan internal—Menyimpan data privat pada memori perangkat.
  • Penyimpanan eksternal—Menyimpan data publik pada penyimpanan eksternal bersama.
  • Database SQLite—Menyimpan data terstruktur dalam database privat.
  • Koneksi jaringan—Menyimpan data di web dengan server jaringan sendiri.
  • Pencadangan Awan—Membuat cadangan data pengguna dan aplikasi di awan.
  • Penyedia materi—Menyimpan data secara privat dan membuatnya tersedia secara publik. Hal ini akan dibahas dalam bab berikutnya.
  • Database realtime Firebase—Menyimpan dan menyinkronkan data dengan database awan NoSQL. Data disinkronkan dengan semua klien yang terhubung secara realtime, dan tetap tersedia bila aplikasi Anda offline.

Preferensi bersama

Menggunakan preferensi bersama adalah cara untuk membaca dan menulis pasangan nilai-kunci informasi secara persisten ke dan dari suatu file.
Catatan:Secara default, pasangan nilai-kunci ini tidak digunakan bersama, bukan pula preferensi, jadi jangan mencampuradukkannya dengan Preference API.
Preferensi Bersama dibahas dalam ">bab tersendiri.

File

Android menggunakan sistem file yang serupa dengan sistem file berbasis disk pada platform lainnya seperti Linux. Operasi berbasis disk tentunya familier bagi setiap orang yang telah menggunakan I/O file Linux atau paket java.io.
Semua perangkat Android memiliki dua area file-storage: storage “internal” dan “eksternal”. Nama-nama ini berasal dari masa awal Android, saat kebanyakan perangkat menawarkan memori bawaan non-volatil (penyimpanan internal), plus media storage lepas-pasang seperti kartu micro-SD (penyimpanan eksternal).
Saat ini, beberapa perangkat membagi ruang storage permanen menjadi partisi "internal" dan "eksternal", sehingga walaupun tanpa media storage lepas-pasang, selalu ada dua ruang storage dan perilaku API sama, ada atau tidak ada penyimpanan eksternal. Daftar berikut merangkum fakta tentang setiap ruang storage.
Penyimpanan internal
Penyimpanan eksternal
Selalu tersedia.
Tidak selalu tersedia, karena pengguna bisa memasang penyimpanan eksternal sebagai storage USB, dan dalam beberapa kasus, bisa melepasnya dari perangkat.
Hanya aplikasi Anda yang bisa mengakses file. Secara khusus, direktori penyimpanan internal aplikasi ditetapkan oleh nama paket aplikasi Anda di lokasi khusus sistem file Android. Aplikasi lain tidak bisa menjelajah direktori internal Anda dan tidak memiliki akses baca atau tulis kecuali jika Anda secara eksplisit menyetel file itu agar bisa dibaca atau bisa ditulis.
Bisa dibaca semua orang. Setiap aplikasi bisa membacanya.
Bila pengguna mencopot pemasangan aplikasi, sistem akan membuang semua file aplikasi Anda dari penyimpanan internal.
Bila pengguna mencopot pemasangan aplikasi, sistem akan membuang file aplikasi dari sini hanya jika Anda menyimpannya dalam direktori dari getExternalFilesDir().
Penyimpanan internal adalah yang terbaik bila ingin memastikan bahwa pengguna maupun aplikasi lain tidak bisa mengakses file Anda.
Penyimpanan eksternal adalah tempat terbaik untuk file yang tidak memerlukan pembatasan akses dan untuk file yang ingin Anda gunakan bersama aplikasi lain atau memungkinkan pengguna mengaksesnya dengan komputer.

Penyimpanan internal

Anda tidak memerlukan izin apa pun untuk menyimpan file pada penyimpanan internal. Aplikasi Anda selalu memiliki izin untuk membaca dan menulis file dalam direktori penyimpanan internalnya.
Anda bisa membuat file dalam dua direktori berbeda:
  • Storage permanen: getFilesDir()
  • Storage sementara: getCacheDir(). Disarankan untuk file kecil dan sementara dengan total kurang dari 1 MB. Perhatikan, sistem mungkin menghapus file sementara jika kehabisan memori.
Untuk membuat file baru di salah satu direktori ini, Anda bisa menggunakan konstruktor File(), meneruskan File yang disediakan oleh salah satu metode di atas yang menetapkan direktori penyimpanan internal Anda. Misalnya:
File file = new File(context.getFilesDir(), filename);
Atau, Anda bisa memanggil openFileOutput() untuk mendapatkan FileOutputStream yang menulis ke file dalam direktori internal. Misalnya, inilah cara menulis sejumlah teks ke file:
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}
Atau, jika Anda perlu menyimpan beberapa file ke cache, lebih baik gunakan createTempFile(). Misalnya, metode berikut akan mengekstrak nama file dari URL dan membuat file dengan nama itu dalam direktori cache internal aplikasi Anda:
public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    } catch (IOException e) {
        // Error while creating file
    }
    return file;
}

Penyimpanan eksternal

Gunakan penyimpanan eksternal untuk file yang harus disimpan secara permanen, bahkan jika aplikasi Anda dicopot pemasangannya, dan tersedia bebas untuk pengguna dan aplikasi lainnya, seperti foto, gambar, atau dokumen yang dibuat oleh aplikasi.
Beberapa file privat yang tidak memiliki nilai bagi aplikasi lain juga bisa disimpan pada penyimpanan eksternal. File semacam itu bisa berupa sumber daya aplikasi tambahan yang telah diunduh, atau file media sementara. Pastikan menghapusnya bila aplikasi Anda telah dicopot pemasangannya.

Memperoleh izin untuk penyimpanan eksternal

Untuk menulis ke penyimpanan eksternal, Anda harus meminta izin WRITE_EXTERNAL_STORAGEdalam file manifes. Hal ini secara implisit menyertakan izin untuk membaca.
 
    
    ...

Jika aplikasi Anda perlu membaca penyimpanan eksternal (namun bukan menulisnya), maka Anda perlu mendeklarasikan izin READ_EXTERNAL_STORAGE.
 
    
    ...

Selalu periksa apakah penyimpanan eksternal telah dipasang

Karena penyimpanan eksternal mungkin tidak tersedia—seperti saat pengguna telah memasang storage ke PC atau telah melepas kartu SD yang menyediakan penyimpanan eksternal—Anda harus selalu memverifikasi apakah volume tersedia sebelum mengaksesnya. Anda bisa membuat kueri status penyimpanan eksternal dengan memanggil getExternalStorageState(). Jika keadaan yang dikembalikan sama dengan MEDIA_MOUNTED, maka Anda bisa membaca dan menulis file. Misalnya, metode berikut ini berguna untuk menentukan ketersediaan storage:
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

Penyimpanan eksternal privat dan publik

Penyimpanan eksternal berstruktur sangat spesifik dan digunakan oleh sistem Android. Ada beberapa direktori publik dan direktori privat yang khusus untuk aplikasi Anda. Setiap pohon file ini memiliki tiga direktori yang diidentifikasi melalui konstanta sistem.
Misalnya, setiap file yang Anda simpan ke dalam direktori nada dering publik DIRECTORY_RINGTONESakan tersedia untuk semua aplikasi nada dering lainnya.
Sebaliknya, setiap file yang Anda simpan dalam direktori nada dering privat DIRECTORY_RINGTONES, secara default, hanya bisa dilihat oleh aplikasi Anda dan akan dihapus bersama aplikasi.
Lihat daftar direktori publik untuk daftar selengkapnya.

Mendapatkan deskriptor file

Untuk mengakses direktori penyimpanan eksternal publik, dapatkan sebuah jalur dan buat file yang memanggil getExternalStoragePublicDirectory().
File path = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
Untuk mengakses direktori penyimpanan eksternal pribadi, dapatkan sebuah jalur dan file yang memanggil getExternalFilesDir().
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");

Membuat kueri ruang storage

Jika sudah mengetahui jumlah data yang disimpan, Anda bisa mengetahui apakah tersedia ruang yang cukup tanpa menyebabkan IOException dengan memanggil getFreeSpace() atau getTotalSpace(). Setiap metode ini memberitahukan ruang yang tersedia saat ini dan total ruang di volume storage.
Anda tidak harus memeriksa jumlah ruang yang tersedia sebelum menyimpan file. Sebagai gantinya, Anda bisa langsung mencoba menulis file, kemudian menangkap IOException jika terjadi. Anda mungkin perlu melakukannya jika tidak mengetahui secara persis jumlah ruang yang diperlukan.

Menghapus file

Anda harus selalu menghapus file yang tidak lagi diperlukan. Cara paling langsung untuk menghapus file adalah membuat referensi file yang telah dibuka memanggil delete()pada dirinya sendiri.
myFile.delete();
Jika file disimpan pada penyimpanan internal, Anda juga bisa meminta Context untuk menemukan dan menghapus file dengan memanggil deleteFile():
myContext.deleteFile(fileName);
Sebagai warga yang baik, Anda juga seharusnya secara teratur menghapus file cache yang dibuat dengan getCacheDir().

Berinteraksi dengan rangkuman file

Setelah Anda memiliki deskriptor file, gunakan operator atau aliran file java.io standar untuk berinteraksi dengan file. Hal ini tidak khusus untuk Android dan tidak dibahas di sini.

Database SQLite

Menyimpan data ke database cocok untuk data terstruktur atau berulang, misalnya informasi kontak. Android menyediakan database seperti-SQL untuk keperluan ini.
Bab dan praktik berikut akan mengajarkan secara mendalam cara menggunakan database SQLite bersama aplikasi Android Anda:
  • SQLite Primer
  • Pengantar Database SQLite
  • Praktik Storage Data SQLite
  • Menelusuri Praktik Database SQLite

Opsi storage lain

Android menyediakan opsi storage tambahan di luar cakupan kursus pengantar ini. Jika Anda ingin mendalaminya, lihatlah sumber daya di bawah ini.

Koneksi jaringan

Anda bisa menggunakan jaringan (bila tersedia) untuk menyimpan dan mengambil data pada layanan berbasis web sendiri. Untuk melakukan operasi jaringan, gunakan kelas-kelas dalam paket berikut:

Mencadangkan data aplikasi

Pengguna seringkali menghabiskan banyak waktu serta tenaga untuk membuat data dan menyetel preferensi dalam aplikasi. Mempertahankan data itu untuk pengguna jika mereka mengganti perangkat yang rusak atau memutakhirkan ke perangkat baru merupakan bagian penting untuk memastikan pengalaman pengguna yang menyenangkan.

Auto Backup untuk Android 6.0 (API level 23) dan yang lebih tinggi

Untuk aplikasi dengan versi SDK target berupa Android 6.0 (API level 23) dan yang lebih tinggi, perangkat yang menjalankan Android 6.0 dan yang lebih tinggi secara otomatis membuat cadangan data aplikasi ke awan. Sistem melakukan pencadangan otomatis ini bagi hampir semua data aplikasi secara default, dan melakukannya tanpa harus menulis kode aplikasi tambahan.
Bila pengguna memasang aplikasi pada perangkat baru, atau memasang ulang aplikasi di satu perangkat (misalnya setelah dikembalikan ke setelan pabrik), sistem secara otomatis memulihkan data aplikasi dari awan. Fitur pencadangan otomatis mempertahankan data aplikasi yang dibuat pada perangkat pengguna dengan mengunggahnya ke akun Google Drive pengguna dan mengenkripsinya. Anda atau pengguna tidak akan dikenakan biaya storage data, dan data yang disimpan tidak dihitung terhadap kuota Google Drive pribadi pengguna. Setiap aplikasi bisa menyimpan hingga 25 MB. Setelah data yang dicadangkan mencapai 25 MB, aplikasi tidak akan lagi mengirim data ke awan. Jika melakukan pemulihan data, sistem akan menggunakan cuplikan data terakhir yang dikirim aplikasi ke awan.
Pencadangan otomatis terjadi bila ketentuan berikut terpenuhi:
  • Perangkat sedang tidak digunakan.
  • Perangkat sedang diisi dayanya.
  • Perangkat terhubung ke jaringan Wi-Fi.
  • Paling tidak 24 jam telah berlalu sejak pencadangan terakhir.
Anda bisa menyesuaikan dan mengonfigurasi pencadangan otomatis untuk aplikasi. Lihat Mengonfigurasi Auto Backup for Apps.

Pencadangan untuk Android 5.1 (API level 22) dan yang lebih rendah

Untuk pengguna Android versi sebelumnya, Anda perlu menggunakan Backup API untuk mengimplementasikan pencadangan data. Singkatnya, hal ini mengharuskan Anda:
  1. Mendaftar Android Backup Service untuk mendapatkan Backup Service Key.
  2. Mengonfigurasi Manifes untuk menggunakan Backup Service.
  3. Membuat agen pencadangan dengan memperluas kelas BackupAgentHelper.
  4. Meminta pencadangan bila data berubah.
Informasi selengkapnya dan kode contoh:

Firebase

Firebase adalah platform seluler yang membantu Anda mengembangkan aplikasi, menumbuhkan basis pengguna, dan menghasilkan uang lebih banyak. Firebase terdiri dari beberapa fitur pelengkap yang bisa dipadupadankan sesuai dengan kebutuhan Anda.
Beberapa fitur tersebut adalah Analytics, Perpesanan Awan, Notifikasi, dan Test Lab.
Untuk pengelolaan data, Firebase menawarkan Realtime Database.
  • Simpan dan sinkronkan data dengan database awan NoSQL.
  • Aplikasi yang terhubung akan berbagi data
  • Ditampung di awan
  • Data disimpan sebagai JSON
  • Data disimpan sebagai JSON dan disinkronkan secara real-time dengan setiap klien yang terhubung.
  • Data tetap tersedia saat aplikasi Anda sedang offline