You are on page 1of 29

Pht trin ng

dng
Smartphone
Ti liu lu hnh ni b
y l ti liu tham kho s dng trong mn hc Lp trnh ng dng Smartphone Android
c tng hp, bin son t nhiu ngun bi cc thnh vin ca Nhm nghin cu v ng dng cng
ngh A106-i hc Hoa Sen.
Nhm A106-http://profiles. hoasen. edu. vn/groups/584/
Pht trin ng dng Smartphone Android



Pht trin ng
dng Smartphone

Phn 03: Lu tr d liu
L c Huy
Email: leduchuy89vn@gmail.com
Pht trin ng dng Smartphone Android

Mc lc
1 Lu tr dng file ..................................................................................................... 3
1.1 S dng b nh trong ...................................................................................... 3
1.1.1 Ghi d liu xung tp tin .............................................................................. 3
1.1.2 c d liu t tp tin ................................................................................... 3
1.2 S dng tp tin cache ...................................................................................... 4
1.3 S dng b nh ngoi ..................................................................................... 5
1.4 Mt s phng thc hu dng: ....................................................................... 6
2 Android Preference ................................................................................................. 7
2.1 Ghi d liu ....................................................................................................... 8
2.2 c d liu ...................................................................................................... 8
2.3 Lm vic vi PreferenceActivity ....................................................................... 9
3 Lu tr c s d liu vi SQLite .......................................................................... 18
3.1 c trng ca SQLite .................................................................................... 18
3.2 Thao tc vi SQLite: ...................................................................................... 19
3.2.1 Khi nim c bn ....................................................................................... 19
3.2.2 Xy dng DroidReaderDBOpenHelper ...................................................... 20
3.2.3 Phng thc query() ................................................................................. 23
3.2.4 Phng thc insert(): ................................................................................ 25
3.2.5 Phng thc update(): .............................................................................. 26
3.2.6 Phng thc delete(): ............................................................................... 27


Pht trin ng dng Smartphone Android

1 Lu tr dng file
Cc n gin nht lu tr d liu ca ng dng l ghi xung file. Tuy nhin cch ny hn
ch rt nhiu do cc phng thc c, ghi d liu rt th s, n gin. Phn di y th hin cch c
ghi file n gin.
1.1 S dng b nh trong
Bn c th lu tp tin trc tip b nh trong ca ng dng. Mc nh th tp tin ny s thuc v
ng dng to ra n v cc ng dng khc khng th truy xut n n.
1.1.1 Ghi d liu xung tp tin
ghi d liu xung tp tin ta thc hin cc bc:
01. Gi phng thc FileOutputStream openFileOutput (String name, int mode) to mt i
tng FileOutputStream dng ghi d liu ln tp tin.
Phng thc ny nhn vo ai tham s:
- Tn tp tin.
- Ch ghi. C ba ch :
o MODE_PRIVATE: Tp ch c th c truy xut bn trong ng dng to ra n.
o MODE_WORLD_READABLE: Tp c th c c bi cc ng dng khc.
o MODE_WORLD_WRITEABLE: Tp c th c c v ghi bi cc ng dng
khc.
02. Gi phng thc FileOutputStream.write() ghi d liu xung file.
03. Gi phng thc FileOutputStream.close() ng lung ghi d liu xung file.
VD minh ha:
String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME,
Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
1.1.2 c d liu t tp tin
c d liu t tp tin ta thc hin cc bc:
01. Gi phng thc public abstract FileInputStream openFileInput(String name) to lung
c d liu t file. Phng thc ny nhn vo mt tham s l tn file cn c.
Pht trin ng dng Smartphone Android

02. Gi phng thc FileInputStream.read() c d liu t file.
03. Gi phng thc FileInputStream.close() ng lung c d liu t file.
VD minh ha:
String FILENAME = "hello_file";
String string = "";

FileInputStream fis=null;
try {

fis = openFileInput(FILENAME);
byte[] buffer = new byte[1024];
int count = fis.read(buffer);

string = new String(buffer);

} catch (IOException e) {
e.printStackTrace();
}

finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
1.2 S dng tp tin cache
i lc bn cng mun lu tr tp tin vo th mc cache thay v lu tr vnh vin. Tuy nhin
nu lu tr tp tin trong th mc cache th khi thit b thiu b nh trong th h thng s t xa cc tp
tin ny i.
Vic lu tr tp tin cng tng t nh mc trn. Ta s s dng phng thc public
abstract File getCacheDir () ly v th mc cache lu tr d liu ca ng dng. Th mc ny
thng l: data/data/niit.android/cache trong niit.android l tn package ca ng dng.
V d:
File file = getCacheDir();

String cacheDir = file.getPath();
File downloadingMediaFile = new
File(cacheDir,"downloadingMedia.dat");
FileOutputStream out = null;

Pht trin ng dng Smartphone Android

try {
out = new FileOutputStream(downloadingMediaFile);
out.write(str.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
V d minh ha trn s gn File file bng i tng tr v bi phng thc getCacheDir(). y
l i tng tr n th mc cache ca ng dng.
Thc hin lnh String cacheDir = file.getPath(); ly v chui ng dn tuyt i tr n th
mc cache.
Lnh File downloadingMediaFile = new File(cacheDir,"downloadingMedia.dat"); to i tng
File tr n tp tin downloadingMedia.dat trong th mc va nhc n trn.
Sau tin hnh to FileOutputStream nh v d mc trn c v ghi tp tin.
1.3 S dng b nh ngoi
Ngoi vic lu tr tp tin xung b nh trong ca thit b ta cn c th lu tr xung b nh
ngoi(Th SD). B nh ngoi ny l thit b lu tr c th tho ri nn ta cn tin hnh kim tra trng
thi ca b nh ngoi(ang cm vo my tnh, tho ra) trc khi c v ghi d liu ln n. Ta
tin hnh nh sau:
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
// C th c v ghi d liu
mExternalStorageAvailable = mExternalStorageWriteable =
true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// Ch c th c
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
mExternalStorageAvailable = mExternalStorageWriteable =
false;
}
Pht trin ng dng Smartphone Android

Nu bn s dng API lever 8 tr ln th bn c th gi phng thc public
abstract File getExternalFilesDir (String type) ly v i tng tr n th mc lu tr trn b nh
ngoi (Th nh SD) ca thit b. Thng s String type l kiu th mc mun truy xut:
o DIRECTORY_ALARMS: Th mc cha cc tp tin m thanh dng lm bo thc.
o DIRECTORY_DCIM: Th mc cha cc tp tin hnh nh v video c ghi li bi thit
b.
o DIRECTORY_DOWNLOADS: Th mc cha cc tp tin c ti v.
o DIRECTORY_MOVIES: Th mc cha cc tp tin phim.
o DIRECTORY_MUSIC: Th mc cha cc tp tin m nhc.
o DIRECTORY_NOTIFICATIONS: Th mc cha cc tp tin m thanh dng lm m
bo notification.
o DIRECTORY_PICTURES: Th mc cha cc tp tin hnh nh.
o DIRECTORY_PODCASTS: Th mc cha cc tp tin padcast.
o DIRECTORY_RINGTONES: Th mc cha cc tp tin dng lm nhc chung.
Nu bn s dng API 7 tr xung ta c th s dng phng thc: public
static File getExternalStorageDirectory () to i tng File tr n th mc gc ca b nh ngoi.
Ta s cng thm vo ng dn ny ch n th mc cn lu tr d liu:
o Alarms: Th mc cha cc tp tin m thanh dng lm bo thc.
o Download: Th mc cha cc tp tin c ti v.
o Movies: Th mc cha cc tp tin phim (Bao gm c cc video quay bng camera).
o Music: Th mc cha cc tp tin m nhc.
o Notifications: Th mc cha cc tp tin m thanh dng lm m bo notification.
o Pictures: Th mc cha cc tp tin hnh nh (Bao gm c hnh nh chp t camera).
o Podcasts: Th mc cha cc tp tin padcast.
o Ringtones: Th mc cha cc tp tin dng lm nhc chung.
Sau khi c c i tng File ta c th tip tc lm vic nh cc v d trn.
1.4 Mt s phng thc hu dng:
public abstract File getFilesDir (): Ly ng dn tuyt i n th mc h thng ni tp tin
c lu tr.
Pht trin ng dng Smartphone Android

public abstract File getDir (String name, int mode): To mi (hoc m nu n tn ti) mt
th mc bn trong b nh trong ca ng dng.
public abstract boolean deleteFile (String name): Xa mt tp tin trong b nh trong.
public abstract String[] fileList (): Tr v danh sch cc tp tn c ghi xung b nh trong
ca ng dng.
2 Android Preference
Khi lm vic vi bt k ng dng no trn my tnh ta quen vi khi nim Preferences.
Mt v d in hnh l khi s dng trnh duyt web Firefox, mt trong nhng thay i m ngi dng
hay s dng nht l thit lp li trang ch. Nhng thng s thit lp ny c lu tr trong Preferences.
V nn tng Android cng h tr khi nim ny, tuy nhin khi nim Preferences trn Android c khc
i cht so vi khi nim nguyn thy ca n trn ng dng desktop. Preferences trn Android s c
lu tr trn tp tin /data/data/[PACKAGE_NAME]/shared_prefs/[PREFERENCE_NAME].xml.
Android h tr i tng SharedPreferences dng c v ghi d liu dng key-value ln file xml k
trn. Bn c th dng SharedPreferences lu tr v truy xut mi loi kiu d liu nh: boolean,
float, int, long v string. ly mt i tng SharedPreferences trn ng dng ta c th s dng mt
trong hai phng thc sau:
- public abstract SharedPreferences getSharedPreferences (String name, int mode):
Phng thc ny s ly v i tng SharedPreferences c ghi d liu ln file xml
vi tn c ch nh bng tham s truyn vo. Tham s int mode trong phng thc trn
dng thit lp quyn truy xut n file xml m i tng SharedPreferences tham chiu
n. C ba loi:
o MODE_PRIVATE: Tp xml m i tng SharedPreferences ch n ch c th
c truy xut bn trong ng dng to ra n.
o MODE_WORLD_READABLE: Tp xml m i tng SharedPreferences c th
c c bi cc ng dng khc.
o MODE_WORLD_WRITEABLE: Tp xml m i tng SharedPreferences c th
c c v ghi bi cc ng dng khc.
ln u tin to ra i tng SharedPreference nu file xml dng lu tr d liu
cha tn ti th h thng s t to file xml vi tn ch nh tham s trn.
- public SharedPreferences getPreferences (int mode):
Phng thc ny s ly v i tng SharedPreferences c ghi d liu ln file xml
dng lu tr Preferences ca Activity hin ti. Phng thc ny s gi li phng thc
getSharedPreferences() k trn vi tham s String name l tn ca Activity hin ti.
Tham s int mode trong phng thc trn dng thit lp quyn truy xut n file xml m
i tng SharedPreferences tham chiu n. N tng t nh tham s int mode mc
Pht trin ng dng Smartphone Android

trn. ln u tin to ra i tng SharedPreference nu file xml dng lu tr d liu
cha tn ti th h thng s t to file xml vi tn l tn ca Activity.
2.1 Ghi d liu
1. Gi phng thc SharedPreferences.edit() ly v mt i tng
SharedPreferences.Editor. Ta s s dng i tng ny ghi d liu xung file xml.
2. Thm d liu vo file xml bng cch gi cc phng thc
SharedPreferences.Editor.putBoolean(), SharedPreferences.Editor.putString().
3. Gi lnh SharedPreferences.comit() hon tt vic thay i ni dung v ghi xung file
xml.
2.2 c d liu
c d liu ta s dng phng thc SharedPreferences.getBoolean() hoc
SharedPreferences.getString().
Di y l mt v d minh ha cch c v ghi d liu bng Preferences:
public class PreferencesExample extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";

@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .

// c d liu
SharedPreferences settings =
getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode",
false);
setSilent(silent);
}

@Override
protected void onStop(){
super.onStop();
SharedPreferences settings =
getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);

// Commit
editor.commit();
}
Pht trin ng dng Smartphone Android

}
2.3 Lm vic vi PreferenceActivity
ng dng ph bin nht ca Preference hin nhin l dng to mt trang Ty chnh(Settings)
cho ng dng nh hnh di y:

Theo nhng g tm hiu phn trn th ta c c mt i tng SharedPreferences dng
c ghi d liu ln file xml. Tuy nhin hin thc mt trang Ty chnh nh trn ta cn phi dng
mt Activity hin th cc ty chn v cho php ngi dng chnh sa cc ty chn . Tuy nhin,
trn Android ta khng cn phi t dng mt Activity hin th cc ty chn nh trn, thay vo
Android cung cp sn cho ta mt lp PreferenceActivity dng hin th cc ty chn cng nh cho
php ngi dng thay i cc ty chn . Sau khi thay i cc gi tr ca ty chn, gi tr ny s c
lu tr vo Preferences. Sau ta c th s dng SharedPreferences c cc gi tr ny ln.
minh ha cch to mt trang Ty chnh ta tin hnh hin thc v d sau:
Gi s xy dng mt ng dng cho php xem thng tin v cc chuyn bay. Thng tin ny s
c lit k di dng danh sch. C nhiu cch sp xp th t ca cc chuyn bay nh: Sp xp theo
gi v, theo s trm dng t nht hay theo th t cc hng hng khng. Trn ng dng c mt trang
Ty chnh cho php thay i cch sp xp cc chuyn bay. Trang Ty chnh c mt thng s duy
nht l Flight Options. Khi nhn v Flight Options ng dng m ln mt danh sch cho php la
mt trong ba cch sp xp cch chuyn bay.
Pht trin ng dng Smartphone Android



Hnh 1 Giao din trang ty chnh

Hnh 2 Giao din la chn gi tr ty
chn

to mt trang giao din nh hnh u ta tin hnh to mi mt file flightoptions.xml vi ni
dung nh sau:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="flight_option_preference"
android:title="@string/prefTitle"
android:summary="@string/prefSummary">

<ListPreference
android:key="@string/selected_flight_sort_option"
android:title="@string/listTitle"
android:summary="@string/listSummary"
android:entries="@array/flight_sort_options"
android:entryValues="@array/flight_sort_options_values
"
android:dialogTitle="@string/dialogTitle"
android:defaultValue="@string/flight_sort_option_defau
lt_value" />
Pht trin ng dng Smartphone Android


</PreferenceScreen>
y l file cha cc th xml nh du trang giao din nh hnh trang ty chn trn. Khi
trang Ty chn trn c m ra. H thng s c ln file xml k trn to thnh giao din nh
hnh. Trong th gc PreferenceScreen i din cho mn hnh trang ty chn, trn s c cc ty
chn. Trn trang ty chn trn ch c duy nht mt ty chn l Flight Option. hin thc ty chn
ny ta s dng th ListPreference. Th ny cho php nh ngha mt ty chn cho php la chn mt
gi tr t mt danh sch cc gi tr cho trc. y ty chn Flight Option s c gi tr l: Total
cost, # of Stops hoc Airline. Ngi dng s c php chn mt trong ba cch sp xp cc chuyn
bay k trn.
Th ListPreference s c mt s thuc tnh nh sau:
Thuc tnh M t
android:key Thuc tnh kha ca ty chnh. Thuc tnh ny s dng truy xut gi tr
ca ty chn sau khi gi tr ca n c lu tr vo file xml.
android:title Tiu ca ty chnh.
android:summary M t tm tt ca ty chnh.
android:entries Tp nhn ca cc mc c th c gn cho ty chnh.
android:entryValues Tp gi tr ca cc mc c th c gn cho ty chnh.
android:dialogTitle Tiu ca hp thoi hin th danh sch cc gi tr ca ty chn ngi
dng la chn.
android:defaultValue Gi tr mc nh ca ty chn.
Xem li v d k trn ta thy c hai thuc tnh ng quan tm nht l android:entries v
android:entryValues. file flightoptions.xml gi tr ca hai thuc tnh ny ln lt l:
android:entries="@array/flight_sort_options"
android:entryValues="@array/flight_sort_options_values"
Gi tr ca hai thuc tnh trn l hai mng c nh ngha trong mt file values. v d mu
trn c th hot ng ta tin hnh b xung file res/values/arrays.xml vi ni dung nh sau:
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/values/arrays.xml -->
<resources>
<string-array name="flight_sort_options">
<item>Total Cost</item>
<item># of Stops</item>
<item>Airline</item>
</string-array>
<string-array name="flight_sort_options_values">
<item>0</item>
Pht trin ng dng Smartphone Android

<item>1</item>
<item>2</item>
</string-array>
</resources>
File xml ny khai bo hai mng kiu string l flight_sort_options v
flight_sort_options_values. Mng flight_sort_options tiu ca cc gi tr c th c gn cho ty
chnh v tp flight_sort_options_values cha gi tr dng gn cho ty chnh. Khi trang Ty chnh
c m th s c giao din nh hnh Giao din trang ty chnh. Khi ngi dng nhn vo Flight
Option th ng dng m ra mt hp thoi hin th ba s la chn: Total cost, # of Stops v Airline. Ba
tiu ny chnh l mng flight_sort_options. Khi ngi dng chn mt gi tr trong ba gi tr k trn
th mt phn t tng ng trong mng flight_sort_options_values s c ghi xung file xml.
Lu : B sung file res/values/strings.xml vi ni dung nh sau:
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/values/strings.xml -->
<resources>
<string name="app_name">Preferences Demo</string>
<string name="prefTitle">My Preferences</string>
<string name="prefSummary">Set Flight Option
Preferences</string>
<string name="flight_sort_option_default_value">1</string>
<string name="dialogTitle">Choose Flight Options</string>
<string name="listSummary">Set Search Options</string>
<string name="listTitle">Flight Options</string>
<string
name="selected_flight_sort_option">selected_flight_sort_option</
string>
<string name="menu_prefs_title">Settings</string>
<string name="menu_quit_title">Quit</string>
</resources>
Sau khi son xong file xml ta to mt file FlightPreferenceActivity.java c ni dung nh sau:
package niit.android;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class FlightPreferenceActivity extends PreferenceActivity
{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.flightoptions);
Pht trin ng dng Smartphone Android

}

}
Lp FlightPreferenceActivity s to ra giao din trang Ty chnh nh yu cu ta t ra ban
u. Do ta khng xc nh tn ca Preferences nn cc gi tr ty chn k trn s c lu vo file:
/data/data/[PACKAGE_NAME]/shared_prefs/[PACKAGE_NAME]_preferences.xml. y l file cha
gi tr Preferences mc nh ca ton ng dng. Nu mun ta vn c th ch nh tn cho Preferences
cng nh quyn truy xut n cc file xml lu tr gi tr bng cch b xung cc cu lnh sau:
PreferenceManager prefMgr = getPreferenceManager();
prefMgr.setSharedPreferencesName("main");
prefMgr.setSharedPreferencesMode(MODE_WORLD_WRITEABLE);
Lu : Do FlightPreferenceActivity cng l mt Activity nn cn b xung khai bo cho
Activity ny trong file manifest.xml nhng vi cc Activity khc.
s dng FlightPreferenceActivity k trn ta c th to mt project c mt Activity chnh
dng m FlightPreferenceActivity. B xung cch file sau vo project mi to ra:
<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/menu/mainmenu.xml -->
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_prefs"
android:title="@string/menu_prefs_title"/>
<item android:id="@+id/menu_quit"
android:title="@string/menu_quit_title"/>
</menu>

<?xml version="1.0" encoding="utf-8"?>
<!-- This file is /res/layout/main.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:text="" android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

</LinearLayout>

package niit.android;

Pht trin ng dng Smartphone Android

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class main extends Activity {

private TextView tv = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

tv = (TextView)findViewById(R.id.text1);

setOptionText();
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected (MenuItem item)
{
if (item.getItemId() == R.id.menu_prefs)
{
Intent intent = new Intent().setClass(this,
FlightPreferenceActivity.class);
this.startActivityForResult(intent, 0);
}
else if (item.getItemId() == R.id.menu_quit)
{
finish();
}
return true;
}

Pht trin ng dng Smartphone Android

@Override
public void onActivityResult(int reqCode, int resCode,
Intent data)
{
super.onActivityResult(reqCode, resCode, data);
setOptionText();
}

private void setOptionText()
{
SharedPreferences prefs =
getSharedPreferences("niit.android_preferences", 0);
String option =
prefs.getString(this.getResources().getString(R.string.selected_
flight_sort_option),
this.getResources().getString(R.string.flight_sort_option_d
efault_value));
String[] optionText =
this.getResources().getStringArray(R.array.flight_sort_options);

tv.setText("Option value is " + option + " (" +
optionText[Integer.parseInt(option)] + ")");
}

}
Ngoi ListPreference ta cn c 03 loi Preference na l CheckBoxPreference,
EditTextPreference v RingtonePreference. Tin hnh b sung file flightoptions.xml vi ni dung
nh sau:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="flight_option_preference"
android:title="@string/prefTitle"
android:summary="@string/prefSummary">
<ListPreference
android:key="@string/selected_flight_sort_option"
android:title="@string/listTitle"
android:summary="@string/listSummary"
android:entries="@array/flight_sort_options"
android:entryValues="@array/flight_sort_options_values"
android:dialogTitle="@string/dialogTitle"
android:defaultValue="@string/flight_sort_option_default_va
lue" />
<CheckBoxPreference
android:key="show_airline_column_pref"
android:title="Airline"
Pht trin ng dng Smartphone Android

android:summary="Show Airline column" />
<CheckBoxPreference
android:key="show_departure_column_pref"
android:title="Departure"
android:summary="Show Departure column" />
<CheckBoxPreference
android:key="show_arrival_column_pref"
android:title="Arrival"
android:summary="Show Arrival column" />
<CheckBoxPreference
android:key="show_total_travel_time_column_pref"
android:title="Total Travel Time"
android:summary="Show Total Travel Time column" />
<CheckBoxPreference
android:key="show_price_column_pref"
android:title="Price"
android:summary="Show Price column" />
<PreferenceScreen
android:title="Subscreen"
android:summary="Subscreen">
<EditTextPreference
android:key="package_name_preference"
android:title="Set Package Name"
android:summary="Set the package name for
generated code"
android:dialogTitle="Package Name" />
<RingtonePreference
android:key="ring_tone_pref"
android:title="Set Ringtone Preference"
android:showSilent="true"
android:ringtoneType="ringtone"
android:summary="Set Ringtone" />
</PreferenceScreen>
</PreferenceScreen>
Khi thc thi chng trnh ta s nhn c kt qu nh sau:
Pht trin ng dng Smartphone Android


CheckBoxPreference hin th CheckBox cho php ngi dng check chn.
EditTextPreference s dng hin th mt hp thoi cho php ngi dng nhp vo mt on
vn bn. Gi tr ca on vn bn trn s c lu xung file xml.
RingtonePreference s dng hin th mt hp la chn nhc chung. ng dn ch n file
nhc chung s c lu tr xung file xml.
Ngoi ra ta c th s dng th PreferenceScreen phn mc con cho trang Ty chnh k
trn. Gi tr lu xung file xml nh sau:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="show_departure_column_pref" value="false" />
<boolean name="show_total_travel_time_column_pref"
value="false" />
<string
name="ring_tone_pref">content://settings/system/ringtone</s
tring>
<string name="package_name_preference">huye</string>
<string name="selected_flight_sort_option">1</string>
<boolean name="show_airline_column_pref" value="false" />
<boolean name="show_arrival_column_pref" value="false" />
<boolean name="show_price_column_pref" value="false" />
</map>

Pht trin ng dng Smartphone Android

3 Lu tr c s d liu vi SQLite
Khi lp trnh trn di ng hay cc thit b c dung lng b nh hn ch, ngi ta thng dng
SQLite. SQLite l mt h qun tr c s d liu nhng c hin thc t chun SQL-92. Ging vi ci
tn ca n, SQLite chim dung lng nh (khong 275KB) nn vic truy xut d liu c nhanh
chng, khng chim dng qu nhiu ti nguyn h thng. Do SQLIte l phn mm m ngun m nn
n khng b gii hn tc quyn. V l do m SQLite c nhiu hng s dng (Adobe, Apple,
Google, Sun, Symbian) v cc d n m ngun m (Mozila, PHP, Python). c bit, i vi Android,
SQLite rt thch hp to c s d liu cho cc ng dng.
SQLite tuy nh hn so vi cc h c s d liu khc nhng cng khng khc bit nhiu. SQLite
cng s dng ngn ng truy vn SQL (SELECT, INSERT, DELETE). SQLite c mt h thng cu
lnh SQL y vi cc triggers, transactions. Cc cu truy vn cng nh cc h c s d liu khc.
SQLite nh mt bn thu nh ca so vi cc h CSDL khc, v vy n khng th c y cc ch
nng trn chic in thoi di ng ca bn.
SQLite l mt la chn thch hp dnh cho ng dng trn h iu hnh Android. Ngoi dung
lng lu tr nh gn, SQLite cn cho php s dng Unicode, kiu d liu khng c ci t trong
mt s phin bn Android.
3.1 c trng ca SQLite
- SQLite c hin thc t tiu chun SQL-92 ca mt ngn ng SQL nhng vn cn cha
mt s khim khuyt.
- Tuy SQLite h tr triggers nhng bn khng th vit trigger cho view. Hoc SQLite khng
h tr lnh ALTER TABLE, do , bn khng th thc hin chnh sa hoc xa ct trong
bng.
- SQLite khng h tr rng buc kha ngoi , cc transactions lng nhau, php kt RIGHT
OUTER JOINT, FULL OUTER JOINT.
- SQLite s dng kiu d liu khc bit so vi h qun tr c s d liu tng ng. Bn c th
insert d liu kiu string vo ct kiu integer m khng gp phi bt k li no.
- Vi tin trnh hoc lung c th truy cp ti cng mt c s d liu. Vic c d liu c th
chy song song, cn vic ghi d liu th khng c php chy ng thi.
- Ngoi cc khim khuyt trn th Sqlite cung cp cho ngi dng gn nh y cc chng
nng m mt h c s d liu cn c nh to database; to bng; thm, xa, sa d liu.
Pht trin ng dng Smartphone Android

3.2 Thao tc vi SQLite:
3.2.1 Khi nim c bn
thao tc vi c s d liu lu tr trn SQLite trn Android ta s lm vic vi hai loi i
tng:
SQLiteOpenHelper: i tng dng to, nng cp, ng m kt ni trn mt c s d liu.
SQLiteDatabase: i tng dng thc thi cc cu lnh SQL trn mt c s d liu.
Bng cch trn mi c s d liu trn mt ng dng s c mt i tng SQLiteOpenHelper
dng dng to mi, nng cp cng nh ng m c s d liu. Thng qua vic s dng i tng
SQLiteOpenHelper ta s ly v mt i tng kiu SQLiteDatabase, y chnh l th hin ca c s d
liu ta cn thao tc. SQLiteOpenHelper h tr hai phng thc ly v mt i tng
SQLiteDatabase l:
getReadableDatabase(): Ly v mt i tng SQLiteDatabase dng ch c.
getWriteableDatabase(): Ly v mt i tng SQLiteDatabase dng c v ghi.
to mi mt c s d liu ta s k tha lp SQLiteOpenHelper. SQLiteOpenHelper h tr
cho chng ta 3 phng thc chnh:
- Phng thc khi to (constructor): Phng thc ny cung cp cc tham s cn thit
SQLiteOpenHelper c th lm vic vi c s d liu trn Android.
- Phng thc onCreate() c dng to file lu tr c s d liu, to cc bng c trong c s
d liu cng nh nhp cc d liu ban u.
- Phng thc onUpgrade() c dng gip bn cp nht li cc bng (table) trong trong c
s d liu.
Mi c s d liu trn mt ng dng Android c nhiu phin bn. Cc phin bn ny c th
tng ng vi cc phin bn ca ng dng.
VD: ng dng qun l thi kha biu sinh vin:
- Phin bn 01: Ch c chc nng qun l thi kha biu nn c cc bng:
o Hc k.
o Mn hc.
o Lp mn hc.
o Bi tp.
- Phin bn 02: Cp nhp thm chc nng qun l contact sinh vin, ging vin nn c thm
bng sau:
o Contact
Pht trin ng dng Smartphone Android

Tng ng vi mi phin bn ng dng k trn s c hai phin bn c s d liu khc nhau.
Mi khi nng cp phin bn ng dng ta cng phi tin hnh nng cp phin bn c s d liu. iu
ny s thc hin phng thc onUpgrade() k trn.
3.2.2 Xy dng DroidReaderDBOpenHelper
Di y minh ha vic xy dng c s d liu cho ng dng DroidReader. y l mt ng
dng s dng c tin rss. ng dng c mt c s d liu dng lu li cch knh rs. c c
mt c s nh vy ta tin hnh to mt class DroidReaderDBOpenHelper nh sau:
public class DroidReaderDBOpenHelper extends SQLiteOpenHelper{

private static final String DATABASE_NAME = "droid_reader";

private static final String DATABASE_CREATE_STATEMENTS = ""
+
"CREATE TABLE \"channel\" (" +
"\"c_id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ," +
"\"c_title\" VARCHAR," +
"\"c_url\" VARCHAR," +
"\"c_description\" VARCHAR," +
"\"c_pub_date\" DATETIME DEFAULT CURRENT_DATE," +
"\"c_last_build_date\" DATETIME DEFAULT CURRENT_DATE," +
"\"c_copyright\" VARCHAR," +
"\"c_generator\" VARCHAR" +
")";

public DroidReaderDBOpenHelper(Context context,int
DATABASE_VERSION) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_STATEMENTS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {

}

public SQLiteDatabase getDatabase(){
return this.getWritableDatabase();
}

Pht trin ng dng Smartphone Android

public boolean closeAllDatabase(){
try{
this.close();
}
catch (Exception e) {
return false;
}
return true;
}

public Cursor query(String table, String[] columns, String
selection, String[] selectionArgs, String groupBy, String
having, String orderBy){

SQLiteDatabase database = this.getWritableDatabase();

Cursor result = null;

try {
result = database.query(table, columns,
selection, selectionArgs, groupBy, having, orderBy);
} catch (Exception e) {
e.printStackTrace();
}
finally{
database.close();
}

return result;
}

public long update(String tableName,ContentValues
values,String whereClause, String[] params){

int count = 0;

SQLiteDatabase database = this.getWritableDatabase();

try{
count = database.update( tableName, values,
whereClause, params);
} catch(Exception e){
e.printStackTrace();
} finally {
database.close();
}

Pht trin ng dng Smartphone Android

return count;
}

public long insert(String tableName,ContentValues values){

SQLiteDatabase database = this.getWritableDatabase();

long count = database.insert(tableName, null, values);

return count;
}

public int deleteRow(String table,String clause,String[]
params){

SQLiteDatabase database = getDatabase();

int count = 0;

try{
count = database.delete(table, clause, params);
}
catch(Exception e){
e.printStackTrace();
}
finally{
database.close();
}

return count;

}
}
Ta c th thy c class DroidReaderDBOpenHelper trn ta nh ngha mt phng thc
khi to vi ni dung:
public DroidReaderDBOpenHelper(Context context,int
DATABASE_VERSION) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}
Phng thc khi to trn n gin s gi phng thc khi to ca class SQLiteOpenHelper.
Phng thc khi to ny s tin hnh kim tra xem c s d liu trn tn ti hay cha. Nu c s
d liu cha tn ti th n s gi phng thc onCreate() to mi c s d liu. Nu c s d liu
tn ti th n s tin hnh kim tra phin bn c s d liu hin ti, nu phin bn hin ti c hn
Pht trin ng dng Smartphone Android

phin bn khi khi to i tng DroidReaderDBOpenHelper th s tin hnh gi phng thc
onUpgrade() nng cp phin bn c s d liu.
Trong DroidReaderDBOpenHelper trn ta thy c phng thc sau:
- getDatabase():
o M t:
Dng ly v mt i tng kiu SQLiteDatabase, y chnh l i tng
c s d liu ca ng dng.
- closeAllDatabase():
o M t:
Dng ng ton b cc c s d liu c m bi
DroidReaderDBOpenHelper. Phng thc ny n gin s gi phng thc
close() ca class SQLiteOpenHelper.
Ngoi hai phng thc chnh trn ta cn c nhng phng thc sau:
- query(): Dng truy vn d liu.
- insert(): Dng thm dng d liu.
- update(): Dng cp nhp dng d liu.
- delete(): Dng xa dng d liu.
Cc phng thc ny s c trnh by r hn phn sau:
3.2.3 Phng thc query()
- M t:
o Dng thc thi mt cu lnh truy vn.
o Phng thc ny s to mt i tng database kiu SQLiteDatabase. y l i
tng c tr v bi phng thc getReadableDatabase() c nh ngha trong
class SQLiteOpenHelper. Phng thc ny cho php ly v i tng
SQLiteDatabase dng ch c. Ta s s dng i tng database ny thc thi
cu truy vn.
- Input:
o String table: Tn bng cn truy vn d liu.
o String[] colums: Mng cha tn cc ct cn ly d liu.
Pht trin ng dng Smartphone Android

o String selection: Mnh iu kin ca cu truy vn (Mnh where). Mnh ny
c dng: id=? AND name=?. Trong gi tr ca id v name s c ch nh
tham s String[] selectionArgs.
o String[] selectionArgs: Tham s ca mnh iu kin trn.
o String groupBy: iu kin group by.
o String having: iu kin having.
o String orderBy: iu kin order by.
- Output:
o Con tr Cursor ch n dng d liu u tin. Ta s s dng con tr ny c cc
dng d liu trn tp d liu c tr v bi cu lnh query.
Ni dung ci t ca phng thc nh sau:
public Cursor query(String table, String[] columns, String
selection, String[] selectionArgs, String groupBy, String
having, String orderBy){
SQLiteDatabase database = this.getWritableDatabase();
Cursor result = null;
try {
result = database.query(table, columns, selection,
selectionArgs, groupBy, having, orderBy);
} catch (Exception e) {
e.printStackTrace();
}
finally{
database.close();
}
return result;
}
Phng thc query trn s to mt i tng database c tr v t phng thc
getWriteableDatabase() . Phng thc ny cho php ly v i tng SQLiteDatabase dng c v
ghi. Khi thc thi, phng thc database.query() s tr v i tng Cursor. y l i tng con tr
tr n tp record c tr v bi cu truy vn. Ta s s dng con tr ny c d liu theo cch sau:
DroidReaderDBOpenHelper myOpenHelper = new
DroidReaderDBOpenHelper(context);
String[] colums = {"c_id","c_title","c_url","c_description"};

Cursor result = myOpenHelper.query("channel", colums, null,
null, null, null, "c_title");

ArrayList<Channel> channels = new ArrayList<Channel>();

Pht trin ng dng Smartphone Android

// Di chuyn n dng u tin
result.moveToFirst();
while (!result.isAfterLast()) {

String c_id = result.getString(0);
String c_title = result.getString(1);
String c_url = result.getString(2);
String c_description = result.getString(3);
// Di chuyn n dng tip theo.
result.moveToNext();
}
// ng con tr.
result.close();
// ng kt ni tt c database ang m.
myOpenHelper.close();

Vi cch ci t phng thc DroidReaderDBOpenHelper.query() trn ta ch c th truy vn
d liu trn mt bng. truy vn d liu trn nhiu hn mt bng ta c th ci t li phng thc
ny vi mt cht thay i. Thay v gi lnh database.query() th ta i thnh
database.rawQuery(String sql, String[] selectionArgs). Phng thc ny nhn vo hai tham s. Trong
tham s String sql l cu lnh SQL dng truy vn d liu. Cu lnh ny c dng: SELECT url,
description FROM channel WHERE id=?. Trong gi tr ca id s c cung cp trong mng
String[] selectionArgs. Bng cch ny ta c th truy vn d liu t nhiu hn mt bng.
3.2.4 Phng thc insert():
- M t:
o y l phng thc dng thm mt dng vo c s d liu.
o Phng thc ny s to mt i tng database kiu SQLiteDatabase. y l i
tng c tr v bi phng thc getWriteableDatabase() c nh ngha trong
class SQLiteOpenHelper. Phng thc ny cho php ly v i tng
SQLiteDatabase dng c v ghi. Ta s s dng i tng database ny thc
thi cu truy vn.
- Input:
o String tableName: Tn bng cn thm d liu.
o ContentValues values: i tng cha d liu ca cc ct cn thm vo. i tng
ny gn ging vi kiu d liu t in. Trong key s l tn ct cn thm d liu
v value l d liu cn thm.
- Output:
o S dng d liu thm thnh cng.
Pht trin ng dng Smartphone Android

Ni dung ci t ca phng thc nh sau:
public long insert(String tableName,ContentValues values){
SQLiteDatabase database = this.getWritableDatabase();
long count = database.insert(tableName, null, values);
return count;
}
Phng thc trn cng tng t nh phng thc query trn. Tuy nhin, y ta s gi
phng thc database.insert() cp nhp d liu vi cc tham s cp trn.
3.2.5 Phng thc update():
- M t:
o y l phng thc dng cp nhp mt dng trong c s d liu.
o Phng thc ny s to mt i tng database kiu SQLiteDatabase. y l i
tng c tr v bi phng thc getWriteableDatabase() c nh ngha trong
class SQLiteOpenHelper. Phng thc ny cho php ly v i tng
SQLiteDatabase dng c v ghi. Ta s s dng i tng database ny thc
thi cu truy vn.
- Input:
o String tableName: Tn bng cn cp nht.
o String whereClause: Mnh iu kin ca dng cn cp nhp d liu (Mnh
where). Mnh ny c dng: id=? AND name=?. Trong gi tr ca id v name
s c ch nh tham s String[] parms.
o String[] parms: Tham s ca mnh iu kin trn.
o ContentValues values: i tng cha d liu ca cc ct cn cp nhp. i tng
ny gn ging vi kiu d liu t in. Trong key s l tn ct v value l d liu
cn cp nhp.
- Output:
o S dng cp nhp thnh cng.
Ni dung ci t ca phng thc nh sau:
public long update(String tableName,ContentValues values,String
whereClause, String[] params){
int count = 0;
SQLiteDatabase database = this.getWritableDatabase();

try{
Pht trin ng dng Smartphone Android

count = database.update( tableName, values,
whereClause, params);
} catch(Exception e){
e.printStackTrace();
} finally {
database.close();
}
return count;
}
3.2.6 Phng thc delete():
- M t:
o y l phng thc dng xa mt dng trong c s d liu.
o Phng thc ny s to mt i tng database kiu SQLiteDatabase. y l i
tng c tr v bi phng thc getWriteableDatabase() c nh ngha trong
class SQLiteOpenHelper. Phng thc ny cho php ly v i tng
SQLiteDatabase dng c v ghi. Ta s s dng i tng database ny thc
thi cu truy vn.
- Input:
o String tableName: Tn bng cn xa d liu.
o String whereClause: Mnh iu kin ca dng cn xa (Mnh where). Mnh
ny c dng: id=? AND name=?. Trong gi tr ca id v name s c ch
nh tham s String[] parms.
o String[] parms: Tham s ca mnh iu kin trn.
- Output:
o S dng xa thnh cng.
Ni dung ci t ca phng thc nh sau:
public int delete(String tableName,String whereClause,String[]
params){
SQLiteDatabase database = getDatabase();
int count = 0;
try{
count = database.delete(tableName, whereClause,
params);
}
catch(Exception e){
e.printStackTrace();
}
Pht trin ng dng Smartphone Android

finally{
database.close();
}
return count;
}

You might also like