Data Presistence (Ruajtja e...
Transcript of Data Presistence (Ruajtja e...
Data Presistence(Ruajtja e shënimeve)
Ligjërata e shatë
Ligjerues Burim Avdiu
UPZ -Universiteti i Prizrenit
Agjenda
• Ruajtja e shënimeve duke përdorur SharedPreferences object
• Mundësin që përdoruesit të modifikojnë preferencat duke
përdorur klasën PreferenceActivity
• Shkruarja dhe leximi në fajlla të jashtëm dhe të brendëshëm
• Krijimi dhe përdorimi i SQLite database
Hyrje në vazhdueshmërinë e të dhënat
• In this chapter, you will learn how to persist data in your
Android applications. Persisting data
• is an important topic in application development, as users
typically expect to reuse data in the
• future. For Android, there are primarily three basic ways of
persisting data:
• ➤ A lightweight mechanism known as shared preferences to
save small chunks of data
• ➤ Traditional fi le systems
• ➤ A relational database management system through the
support of SQLite databases
Ruajtja dhe ngarkimi i preferencav të përdoruesit
Android ofron SharedPreferences object për të mundësuar ruajtjen e shënimeve në
app.
P.sh. App mund ofroj përdoruesve të caktoj madhësinë e tekstit. Në këtë rast app
duhet të dijë madhësinë e caktuar nga përdoruesi. Për këtë arsye mundësohet
ruajtja e shënimeve në fajll, po duhet të kryhen disa rutina për menaxhimin e fajllit, si
shkruarjen e shënimeve në fajll, caktimin sa karaktere për tu lexuar, etj.
Gjithashtu ka info të tjera që mund të ruhen si madhësi e tekstit, emri i fontit, ngjyra e
prapavijës, etj. Pra siç po shihet nevojat për ruajtje në fajlla janë të mëdha.
Një alternativë tjetër e shkruarjes në fajll është përdorimi i database-db, mirëpo ruajtja
e shënimeve në db është e vështirë, nga aspekti i zhvilluesit dhe performancës së app.
Me përdorimin e SharedPreferences object, megjithatë, ju ruani shënime që ju duhen
me anë të emrit dhe vlerës .
Qasja në preferencat me anën e Activity
Në këtë ushtrim do të mësojmë si ruhen shënimet me anë të SharedPreferences object.
<?xml version=”1.0” encoding=”utf-8”?>
<PreferenceScreen xmlns:android=”http://schemas.android.com/apk/res/android”>
<PreferenceCategory android:title=”Category 1”>
<CheckBoxPreference android:title=”Checkbox”
android:defaultValue=”false”
android:summary=”True or False”
android:key=”checkboxPref” />
</PreferenceCategory>
<PreferenceCategory android:title=”Category 2”>
<EditTextPreference android:summary=”Enter a string”
android:defaultValue=”[Enter a string here]”
android:title=”Edit Text”
android:key=”editTextPref” />
<RingtonePreference
android:summary=”Select a ringtone”
android:title=”Ringtones”
android:key=”ringtonePref” />
Qasja në preferencat me anën e Activity
<PreferenceScreen android:title=”Second Preference Screen”
android:summary=“Click here to go to the second Preference Screen”
android:key=”secondPrefScreenPref” >
<EditTextPreference android:summary=”Enter a string”
android:title=”Edit Text (second Screen)”
android:key=”secondEditTextPref” />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//---load the preferences from an XML file---
addPreferencesFromResource(R.xml.myapppreferences);
}
Intent i = new Intent(“net.learn2develop.AppPreferenceActivity”);
startActivity(i);
Korrigjimi dhe modifikimi e vlerave të pref. me programim
Më herët shtjelluam shtjelluam se si me anë të klasës PreferenceActivity lejohet lehtë
ruajtja e preferencave në app.Tash do të shohim si mund të i përdorim këto vlera në
app.
public void onClickDisplay(View view) {
SharedPreferences appPrefs =
getSharedPreferences(“net.learn2develop.UsingPreferences_preferences”,
MODE_PRIVATE);
DisplayText(appPrefs.getString(“editTextPref”, “”));
}
public void onClickModify(View view) {
SharedPreferences appPrefs = getSharedPreferences(
“edu.upz.UsingPreferences_preferences”, MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString(“editTextPref”, ((EditText)
findViewById(R.id.txtString)).getText().toString());
prefsEditor.commit();
}
Ndryshimi i emrit fillestar të fajllit pref.
• Notice that by default the name of the preferences fi le saved on the device is
net.learn2develop
• .UsingPreferences_preferences.xml, with the package name used as the prefi x.
However,
• sometimes it is useful to give the preferences fi le a specifi c name. In this case, you
can do the
• following.
Në medotëat AppPreferenceActivity
PreferenceManager prefMgr = getPreferenceManager();
prefMgr.setSharedPreferencesName(“appPreferences”);
Në medotëat onClickDisplay, onClickModify
SharedPreferences appPrefs =
getSharedPreferences(“appPreferences”, MODE_PRIVATE);
http://developer.android.com/guide/topics/data/data-storage.html#pref
Ruajtja e shënimeve në fajll
SharedPreferences object lejon ruajtjen e shënimeve si të gjitha me emer/vlerë —
p.sh. Përdoruesi ID, DOB, gjinia, numri i patent shoferit, etj.
Megjithatë është e nevojshme dhe ruajtja e shënimeve në mënyrë tradicionale si fajll.
P.sh. Ruajtjen e tekstit për poezinë që dëshirohet të paraqitet në app.
Në Android, mund të përdoren klasë të paketës java.io package.
Ruajtja në hapësira të brendëshme
Mënyra e parë e ruajtjes së fajllave në Android app. është ruajtja në paisje brenda.
Ushtrimi në vijim paraqet ruajtjen e fajllit lokalisht.
FileOutputStream fOut =openFileOutput(“textfile.txt”, MODE_WORLD_READABLE);
// Për ruajtjen e tekstit në fajll, openFileOutput() metoda për hapjen e fajllit për shënim
OutputStreamWriter osw = new OutputStreamWriter(fOut);//Kthimin nga stream në bite
osw.write(str);//shruarjen në fajll. osw.flush();//sigurimin që është ruajtur.
osw.close();//mbyllja
FileInputStream fIn = openFileInput(“textfile.txt”);//për leximin e përmbajtjes.
Ruajtja në hapësira të jashtme (SD Card)
Në shumë raste na duhet që shënimet ti ruajmë jashtë pajisjes (si një SD card) për arsze
të hapësirës ose të kalimit më të letë të shënimeve jashtë.
Ushtrimi në vijim paraqet ruajtjen e fajllit jashtë në SD card:
Krijimi dhe ruajtja e DB
Për ruajtjen e shënimeve relacionale, përdorët DB.
P.sh. nëse dëshirojm ti ruajm shënimet e studentëve në shkoll, rezultatet e provimeve
për ta,etj – gjithsesi është e nevojshme ruajtja e tyre në DB relacionale.
Ruajtja e shënimeve për është në DB relacionale siguron integritetin, kërkimin më të
shpejtë në to,etj.
Për ruajtjen e shënimeve relacionale në Android përdorët SQLite DB.
Android, SQLite DB që ju krijoni ruhet në /data/data/<package_name>/databases
folder.
Krijimi i klasës ndimse DBAdapter
• Një praktik e mirë kur kemi të bëjm me DB është të krijohet një klasë ndimse e cila
do të përmbaj të gjitha funksionalitetet e qasjes së DB.
Në këtë ushtrim po krijojm klasën ndimse DBAdapter, e cila krijon, hapë, mbyll dhe
përdorë një SQLite DB.
Në këtë ushtrim po krijojm DB – MyDB me tabelën Kontaktet,
tabela ka kolonat id, emri dhe email
Fillimisht definohen variablat të cilat do të përmbajnë fushat për tabelën në DB
static final String KEY_ROWID = “id”;
static final String KEY_NAME = “emri”;
static final String KEY_EMAIL = “email”;
static final String TAG = “DBAdapter”;
static final String DATABASE_NAME = “MyDB”;
static final String DATABASE_TABLE = “Kontaktet”;
static final int DATABASE_VERSION = 1;
static final String DATABASE_CREATE =“create table Kontaktet(id integer primary key
autoincrement, emri text not null, email text not null);”;
Krijimi i klasës ndimse DBAdapter
Për krijimin e DB në Aplikacion duke përdorur klasën DBAdapter, krijohet instanca e
klasës DBAdapter:
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
Konstruktori i klasës DBAdapter do të krijoj instancën e klasës DatabaseHelper për krijimin
e një DB:
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
Krijimi i klasës ndimse DBAdapter
Në klasën DBAdapter shtohet dhe klasa private që zgjeron klasën SQLiteOpenHelper, e cila është një klasë ndimse në Android për menaxhimin e DB. Në shembullin tonë ne mbishkruajm onCreate() dhe onUpgrade() metodat:
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try { db.execSQL(DATABASE_CREATE);}
catch (SQLException e) {e.printStackTrace();}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, “Upgrading database from version “ + oldVersion + “ to “
+ newVersion + “, which will destroy all old data”);
db.execSQL(“DROP TABLE IF EXISTS contacts”);onCreate(db);
}
}
Krijimi i klasës ndimse DBAdapter
Gjithashtu janë shtuar metodat për hapjen dhe mbzlljen e DB, pastaj metodat për
shtimin /modifikimin/fshirjen e shënimeve në tabelë:
public DBAdapter open() throws SQLException
{ db = DBHelper.getWritableDatabase(); return this;}
public void close()
{ DBHelper.close();}
public long shtoKontakt(String emri, String email)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, emri);
initialValues.put(KEY_EMAIL, email);
return db.insert(DATABASE_TABLE, null, initialValues);
}
public boolean fshijKontakt(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + “=” + rowId, null) > 0;
}
Krijimi i klasës ndimse DBAdapter
public Cursor merrKontaktet ()
{
return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_EMAIL}, null, null, null, null, null);
}
public Cursor merrKontaktMeID(long rowId) throws SQLException
{
Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_EMAIL}, KEY_ROWID + “=” + rowId, null, null, null, null, null);
if (mCursor != null) { mCursor.moveToFirst();}
return mCursor;
}
public boolean updateContact(long rowId, String name, String email)
{
ContentValues args = new ContentValues();
args.put(KEY_NAME, emri);
args.put(KEY_EMAIL, email);
return db.update(DATABASE_TABLE, args, KEY_ROWID + “=” + rowId, null) > 0;
}
Përdorimi i DB
Me anë e klasës ndimse DBAdapter që krijuam , mund të përdorim tash operacionet e
zakonshme për DBsi (create, read, update and delete).
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DBAdapter db = new DBAdapter(this);
db.open();
long id = db.insertContact(“Wei-Meng Lee”, “[email protected]”);
id = db.insertContact(“Mary Jackson”, “[email protected]”);
db.close();
}
Cursor c =db.merrKontaktet();
if (c.moveToFirst()){do { DisplayContact(c); } while (c.moveToNext());}
public void DisplayContact(Cursor c)
{
Toast.makeText(this, "id: " + c.getString(0) + "\n" + "Emri: " + c.getString(1) + "\n" +
"Email: " + c.getString(2), Toast.LENGTH_LONG).show();
}
Krijimi i DB me Tools
• Në aplikacione reale zakonisht krijohet DB me ndonjë vegel me anën e dizajnit pastaj
bartet në aplikacion.
• Për krijimin e SQLite DB përdorim vegla të ndryshme si SQLiteManager ose tjera.
Fundi
• Pyetje?