20
Data Presistence (Ruajtja e shënimeve) Ligjërata e shatë Ligjerues Burim Avdiu UPZ -Universiteti i Prizrenit

Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

Data Presistence(Ruajtja e shënimeve)

Ligjërata e shatë

Ligjerues Burim Avdiu

UPZ -Universiteti i Prizrenit

Page 2: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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

Page 3: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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

Page 4: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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 .

Page 5: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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” />

Page 6: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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);

Page 7: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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();

}

Page 8: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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

Page 9: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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.

Page 10: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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.

Page 11: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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:

Page 12: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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.

Page 13: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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);”;

Page 14: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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);

}

Page 15: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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);

}

}

Page 16: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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;

}

Page 17: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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;

}

Page 18: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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();

}

Page 19: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

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.

Page 20: Data Presistence (Ruajtja e shënimeve)naserkastrati.weebly.com/uploads/3/8/8/3/38831473/l8-mb-dp.pdf · Ruajtja dhe ngarkimi i preferencav të përdoruesit Android ofron SharedPreferences

Fundi

• Pyetje?