Penyimpanan presisten Android Eclipse
- File berbasis persistence
Android memungkinkan untuk menyimpan data aplikasi melalui sistem file. Dalam setiap aplikasi, sistem Android membuat direktori pada : data/data/[application package].
Android mendukung cara berikut untuk menyimpan data di sistem file lokal:
• File => dapat membuat dan memperbarui file.
• Preferensi => Android memungkinkan menyimpan dan mengambil pasangan nilai kunci persisten dari tipe data primitif.
• Database SQLite - contoh database SQLite juga disimpan di sistem file lokal.
• File disimpan di folder file dan pengaturan aplikasi disimpan sebagai file XML di folder shared_prefs.
• Jika aplikasi membuat database SQLite, database ini disimpan di direktori aplikasi utama di bawah folder database.
Tangkapan layar berikut menunjukkan sistem file yang berisi file, file cache, dan preferensi.
Hanya aplikasi terkait yang dapat menulis ke direktori aplikasinya. Aplikasi itu dapat membuat sub-direktori tambahan di direktori aplikasi ini. Untuk sub-direktori ini, aplikasi dapat memberikan izin baca atau tulis untuk aplikasi lain.
Android memiliki penyimpanan internal dan penyimpanan eksternal. Penyimpanan eksternal tidak bersifat pribadi dan mungkin tidak selalu tersedia. Jika perangkat Android terhubung dengan komputer, komputer dapat memasang sistem eksternal melalui USB dan itu membuat penyimpanan eksternal ini tidak tersedia untuk aplikasi Android.
Pada level Android 8 SDK, dimungkinkan untuk menentukan bahwa aplikasi dapat atau harus ditempatkan pada penyimpanan eksternal. Untuk hal tersebut, setel Android:installLocation ke preferExternal atau auto.
Dalam hal ini, komponen aplikasi tertentu dapat disimpan pada titik pemasangan eksternal terenkripsi. Basis data dan data pribadi lainnya akan tetap disimpan di sistem penyimpanan internal.
- Preferences
- Storing key-value pairs
Kelas SharedPreferences memungkinkan untuk mempertahankan pasangan nilai kunci dari tipe data primitif dalam sistem file Android. Kelas PreferenceManager menyediakan metode untuk mendapatkan akses ke preferensi ini. Kode berikut menunjukkan cara mengakses preferensi dari file tertentu.
# getting preferences from a specified file SharedPreferences settings = getSharedPreferences("Test", Context.MODE_PRIVATE);
Preferensi harus dibuat pribadi untuk aplikasi. File prefernsi dapat diakses melalui semua komponen aplikasi. Penyimpanan default untuk preferensi dapat diakses melalui panggilan metode: PreferenceManager.getDefaultSharedPreferences(this). Nilai preferensi diakses melalui kunci dan instance kelas SharedPreferences, seperti yang ditunjukkan dalam daftar berikut:
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getActivity()); String url = settings.getString("url", "n/a");
Untuk membuat atau mengubah preferensi, Kita harus memanggil metode edit() pada objek SharedPreferences. Setelah Kita mengubah nilainya, Kita harus memanggil metode apply() untuk menerapkan perubahnnya secara asinkron ke sistem file.
Editor edit = preferences.edit(); edit.putString("username", "new_value_for_user"); edit.apply();
Penggunaan metode commit() tidak disarankan, karena ia menulis perubahan secara sinkron ke sistem file.
- Preference Listener
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); // Instance field for listener listener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { // Your Implementation } }; prefs.registerOnSharedPreferenceChangeListener(listener);
- User interface for preferences.
Android menyediakan kelas PreferenceFragment yang menyederhanakan pembuatan antarmuka pengguna untuk mempertahankan nilai preferensi. Fragmen ini dapat memuat file definisi preferensi XML melalui metode addPreferencesFromResource().
- LATIHAN
- Android presistensi preference.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linLayout1Vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linLayout2Horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btnPrefSimple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pref1" />
<Button
android:id="@+id/btnPrefFancy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pref2"
/>
</LinearLayout>
<TextView
android:id="@+id/txtCaption1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ff006666"
android:text="This" />
</LinearLayout>
3. Koding mainActivity.java seperti berikut :
package com.example.presisten;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import java.util.Date;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
Button btnSimplePref;
Button btnFancyPref;
TextView txtCaption1;
Boolean fancyPrefChosen = false;
View myLayout1Vertical;
final int mode = Activity.MODE_PRIVATE;
final String MYPREFS = "MyPreferences_001";
// create a reference to the shared MainActivity object
SharedPreferences mySharedPreferences;
// obtain an editor to add data to my SharedPreferences object
SharedPreferences.Editor myEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myLayout1Vertical = (View)
findViewById(R.id.linLayout1Vertical);
txtCaption1 = (TextView)
findViewById(R.id.txtCaption1);
txtCaption1.setText("This is a sample line \n"
+ "suggesting the way the UI looks \n"
+ "after you choose your preference");
// create a reference & editor for the shared preferences object
mySharedPreferences =
getSharedPreferences(MYPREFS, 0);
myEditor =
mySharedPreferences.edit();
// has a Preferences file been already created?
if (mySharedPreferences != null
&&
mySharedPreferences.contains("backColor")) {
// object and key found show all saved values
applySavedPreferences();
} else {
Toast.makeText(getApplicationContext(), "No Preferences found", 1)
.show();
}
btnSimplePref = (Button)
findViewById(R.id.btnPrefSimple);
btnSimplePref.setOnClickListener(this);
btnFancyPref = (Button)
findViewById(R.id.btnPrefFancy);
btnFancyPref.setOnClickListener(this);
}// onCreate
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// clear all previous selections
myEditor.clear();
// what button has been clicked?
if (v.getId() ==
btnSimplePref.getId()) {
myEditor.putInt("backColor",
Color.BLACK);// black background
myEditor.putInt("textSize", 12); // humble small font
}
else { // case btnFancyPref
myEditor.putInt("backColor",
Color.BLUE); // fancy blue
myEditor.putInt("textSize",
20); // fancy big
myEditor.putString("textStyle",
"bold"); // fancy bold
myEditor.putInt("layoutColor",
Color.GREEN);// fancy green
}
myEditor.commit();
applySavedPreferences();
}
@Override
protected void onPause() {
// warning: activity is on its last state of visibility!.
// It's on the edge of been killed! Better save all current
// state data into Preference object (be quick!)
myEditor.putString("DateLastExecution", new
Date().toLocaleString());
myEditor.commit();
super.onPause();
}
public void applySavedPreferences() {
// extract the <key/value> pairs, use default param for missing data
int backColor =
mySharedPreferences.getInt("backColor",
Color.BLACK);
int textSize =
mySharedPreferences.getInt("textSize", 12);
String textStyle =
mySharedPreferences.getString("textStyle","normal");
int layoutColor =
mySharedPreferences.getInt("layoutColor",
Color.DKGRAY);
String msg = "color " + backColor +
"\n" + "size " + textSize + "\n"
+ "style " + textStyle;
Toast.makeText(getApplicationContext(),
msg, 1).show();
txtCaption1.setBackgroundColor(backColor);
txtCaption1.setTextSize(textSize);
if (textStyle.compareTo("normal") ==
0) {
txtCaption1.setTypeface(Typeface.SERIF,
Typeface.NORMAL);
} else {
txtCaption1.setTypeface(Typeface.SERIF,
Typeface.BOLD);
}
myLayout1Vertical.setBackgroundColor(layoutColor);
}// applySavedPreferences
4. Hasil programnya akan seperti berikut :
Tampilan ketika di klik Pref1:
- Android presistensi File.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget28"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff0000ff"
android:orientation="vertical">
<EditText android:id="@+id/txtData"
android:layout_width="fill_parent"
android:layout_height="180px"
android:text="Enter some data here ..."
android:textSize="18sp" />
<Button
android:id="@+id/btnWriteSDFile"
android:layout_width="143px"
android:layout_height="wrap_content"
android:text="1. Write SD File" />
<Button
android:id="@+id/btnClearScreen"
android:layout_width="141px"
android:layout_height="wrap_content"
android:text="2. Clear Screen" />
<Button
android:id="@+id/btnReadSDFile"
android:layout_width="140px"
android:layout_height="wrap_content"
android:text="3. Read SD File" />
<Button
android:id="@+id/btnClose"
android:layout_width="141px"
android:layout_height="wrap_content"
android:text="4. Close" />
</LinearLayout>
3. Koding mainActivity.java seperti berikut :
package com.example.presistenfilepri;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import java.io.*;
import java.util.Date;
import java.util.Scanner;
import android.content.Context;
import android.os.Environment;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;
public class MainActivity extends Activity {
// GUI controls
EditText txtData,tvMessage;
Button btnWriteSDFile;
Button btnReadSDFile;
Button btnClearScreen;
Button btnClose;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// bind GUI elements with local controls
txtData= (EditText)findViewById(R.id.txtData);
txtData.setHint("Enter some lines of data here...");
btnWriteSDFile = (Button)findViewById(R.id.btnWriteSDFile);
btnWriteSDFile.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// write on SD card file data from the text box
try{
File myFile= new File("/sdcard/mysdfile.txt");
myFile.createNewFile();
FileOutputStream fOut=new FileOutputStream(myFile);
OutputStreamWriter myOutWriter= new OutputStreamWriter(fOut);
myOutWriter.append(txtData.getText());
myOutWriter.close();
fOut.close();
Toast.makeText(getBaseContext(),
"Done writing SD 'mysdfile.txt'", Toast.LENGTH_SHORT).show();
} catch(Exception e) {
Toast.makeText(getBaseContext(),e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}// onClick
}); // btnWriteSDFile
btnReadSDFile= (Button) findViewById(R.id.btnReadSDFile);
btnReadSDFile.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try{
File myFile= new File("/sdcard/mysdfile.txt");
FileInputStream fIn= new FileInputStream(myFile);
BufferedReader myReader= new BufferedReader(new
InputStreamReader(fIn));
String aDataRow= "";
String aBuffer= "";
while((aDataRow= myReader.readLine()) != null) {
aBuffer+= aDataRow+ "\n";
}
txtData.setText(aBuffer);
myReader.close();
Toast.makeText(getBaseContext(),
"Done reading SD 'mysdfile.txt'", 1).show();
} catch(Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), 1).show();
}
}// onClick
}); // btnReadSDFile
btnClearScreen= (Button)
findViewById(R.id.btnClearScreen);
btnClearScreen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// clear text box
txtData.setText("");
}
}); // btnClearScreen
btnClose= (Button) findViewById(R.id.btnClose);
btnClose.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// clear text box
finish();
}
}); // btnClose
}// onCreate
// class
private void testScannerFiles() throws FileNotFoundException{
// Add to manifest the following permission request
// <uses-permission android:name="android.permission.
//WRITE_EXTERNAL_STORAGE" />
try{
String SDcardPath=
Environment.getExternalStorageDirectory().getPath();
String mySDFileName= SDcardPath+ "/"+ "mysdfiletest.txt";
tvMessage.setText("Writing to: "+ mySDFileName);
PrintWriter outfile= new PrintWriter( new
FileWriter(mySDFileName) );
outfile.println("HolaAndroid");
outfile.println("Adios Android");
outfile.println(new Date().toString());
outfile.close();
// read SD-file,showrecords.
Scanner infile= new Scanner(new
FileReader(mySDFileName));
String inString= "\n\nReadingfrom: "+ mySDFileName+ "\n";
while(infile.hasNextLine()) {
inString+= infile.nextLine() + "\n";
}
tvMessage.append(inString);
infile.close();
} catch(FileNotFoundException e) {
tvMessage.setText( "Error: "+ e.getMessage());
} catch(IOException e) {
tvMessage.setText( "Error: "+ e.getMessage());
}
//writing
FileOutputStream fos= openFileOutput("XYZ",
Context.MODE_PRIVATE);
PrintWriter outfile= new PrintWriter( fos);
outfile.println("HolaAndroid");
outfile.close();
// reading
InputStream is = openFileInput("XYZ");
Scanner infile= new Scanner(is);
String inString= "";
while(infile.hasNextLine()) {
inString= infile.nextLine();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Menulis file di SD card :
Clear Screen :
Terima kasih pak materinya
BalasHapusTerimakasih pak untuk materinya
BalasHapus