Data 
Storage 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
張明禾 
• C 
• Android 
App 
• NodeJS 
• Sencha 
Touch 
• Unity 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Data 
Storage 
• Shared 
preferences 
files 
– Saving 
key-­‐value 
pairs 
of 
simple 
data. 
– Private 
or 
shared 
• Android 
file 
system 
– Saving 
arbitrary 
files. 
– Read/Write 
in 
order. 
• Database 
– Saving 
structured 
data. 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
• Key-­‐value 
pair 
of 
data 
• Can 
be 
either 
private 
or 
shared 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
– 
Get 
handle 
• Use 
only 
one 
shared 
preferences 
file 
– PreferenceManager.getDefaultPreferences(context) 
– getPreferences(Context.MODE_PRIVATE) 
• Use 
mulXple 
shared 
preferences 
files 
– getSharedPreferences(FILE_KEY, 
Context.MODE_PRIVATE) 
• Example 
SharedPreferences 
sharedPref 
= 
PreferenceManager.getDefaultSharedPreferences(mCo 
ntext); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
• Accessibility 
– MODE_PRIVATE 
– MODE_WORLD_READABLE 
– MODE_WORLD_WRITEABLE 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
– 
Write 
• SharedPreferences.Editor 
SharedPreferences.Editor 
editor 
= 
sharedPref.edit(); 
editor.putInt(“saved_high_score”, 
100); 
editor.commit(); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
– 
Read 
int 
defaultValue 
= 
60; 
int 
highScore 
= 
sharedPref.getInt(“saved_high_score”, 
defaultValue); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
• FirstAcXvity.java 
SharedPreferences 
sharedPref 
= 
PreferenceManager.getDefaultSharedPreferences(mContext); 
SharedPreferences.Editor 
editor 
= 
sharedPref.edit(); 
for(int 
i 
= 
0; 
i 
< 
mClassmates.size(); 
i++) 
{ 
String 
name 
= 
mClassmates.get(i).name; 
if(sharedPref.contains(name) 
== 
true) 
{ 
if(sharedPref.getBoolean(name, 
false) 
== 
true) 
{ 
// 
Toast 
name 
+ 
“has 
been 
updated” 
} 
} 
else 
{ 
editor.putBoolean(name, 
false); 
} 
} 
editor.commit(); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
SharedPreferences 
• SecondAcXvity.java 
SharedPreferences 
sharedPref 
= 
PreferenceManager.getDefaultSharedPreferences( 
mContext); 
SharedPreferences.Editor 
editor 
= 
sharedPref.edit(); 
editor.putBoolean(mName, 
true); 
editor.commit(); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
1st 
ImplementaXon 
• Save 
update 
status 
of 
every 
classmate 
in 
default 
shared 
preferences 
file. 
• Toast 
classmates’ 
names 
that 
have 
been 
updated 
when 
the 
app 
starts. 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
• Internal 
Storage 
– Accessible 
by 
only 
your 
app 
by 
default. 
– Removed 
when 
your 
app 
is 
uninstalled. 
• External 
Storage 
– World-­‐readable 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
– 
Internal 
Storage 
String 
filename 
= 
"myfile”, 
str 
= 
"Hello 
world!"; 
FileOutputStream 
outputStream; 
try 
{ 
outputStream 
= 
openFileOutput(filename, 
Context.MODE_PRIVATE); 
outputStream.write(str.getBytes()); 
outputStream.close(); 
} 
catch 
(ExcepXon 
e) 
{ 
e.printStackTrace(); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
– 
External 
Storage 
• Permission 
<manifest 
...> 
<uses-­‐permission 
android:name="android.permission.WRITE_EXTERN 
AL_STORAGE" 
/> 
<uses-­‐permission 
android:name="android.permission.READ_EXTERNA 
L_STORAGE" 
/> 
... 
</manifest> 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
– 
External 
Storage 
• Verify 
that 
the 
volume 
is 
available 
before 
accessing 
it 
– getExternalStorageState() 
• Environment.MEDIA_MOUNTED 
• Environment.MEDIA_MOUNTED_READ_ONLY 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
– 
External 
Storage 
• Public 
files 
Environment.getExternalStoragePublicDirectory(Env 
ironment.DIRECTORY_PICTURES) 
• Private 
files 
context.getExternalFilesDir(Environment.DIRECTOR 
Y_PICTURES) 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
File 
– 
Delete 
• myFile.delete(); 
• context.deleteFile(fileName); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
Structure 
• Constants 
• SQLiteOpenHelper 
• OperaXons 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
-­‐ 
Constants 
• DATABASE_NAME 
• DATABASE_VERSION 
• Table 
field 
names 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
-­‐ 
Constants 
• DatabaseConsts.java 
public 
class 
DatabaseConsts 
implements 
BaseColumns 
{ 
public 
final 
staXc 
String 
DATABASE_NAME 
= 
"android.db"; 
public 
final 
staXc 
int 
DATABASE_VERSION 
= 
1; 
public 
final 
staXc 
String 
TABLE_NAME 
= 
"classmates"; 
public 
final 
staXc 
String 
NAME 
= 
"name"; 
public 
final 
staXc 
String 
DESCRIPTION 
= 
"descripXon"; 
public 
final 
staXc 
String 
IMAGE_RESOURCE 
= 
"image_resource"; 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
SQLiteOpenHelper 
• Create 
table 
– onCreate() 
• Upgrade 
table 
– onUpgrade() 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
SQLiteOpenHelper 
• DatabaseHelper.java 
public 
class 
DatabaseHelper 
extends 
SQLiteOpenHelper 
{ 
public 
DatabaseHelper(Context 
context, 
String 
name, 
CursorFactory 
factory, 
int 
version) 
{ 
super(context, 
name, 
factory, 
version); 
} 
@Override 
public 
void 
onCreate(SQLiteDatabase 
db) 
{ 
createTable(db); 
} 
@Override 
public 
void 
onUpgrade(SQLiteDatabase 
db, 
int 
oldVersion, 
int 
newVersion) 
{ 
dropTable(db); 
onCreate(db); 
} 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
SQLiteOpenHelper 
• DatabaseHelper.java 
private 
void 
createTable(SQLiteDatabase 
db) 
{ 
db.execSQL("CREATE 
TABLE 
IF 
NOT 
EXISTS 
" 
+ 
DatabaseConsts.TABLE_NAME 
+ 
" 
(” 
+ 
DatabaseConsts._ID 
+ 
" 
INTEGER 
PRIMARY 
KEY,” 
+ 
DatabaseConsts.NAME 
+ 
" 
TEXT,” 
+ 
DatabaseConsts.DESCRIPTION 
+ 
" 
TEXT,” 
+ 
DatabaseConsts.IMAGE_RESOURCE 
+ 
" 
INTEGER” 
+ 
");"); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
SQLiteOpenHelper 
• DatabaseHelper.java 
public 
void 
dropTable(SQLiteDatabase 
db) 
{ 
db.execSQL("DROP 
TABLE 
IF 
EXISTS 
" 
+ 
DatabaseConsts.TABLE_NAME); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
OperaXons 
• Open 
database 
• Insert 
data 
• Update 
data 
• Get 
data 
• Delete 
data 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
OperaXons 
• DatabaseUXls.java 
public 
class 
DatabaseUXls 
{ 
private 
staXc 
final 
String 
TAG 
= 
DatabaseUXls.class.getSimpleName(); 
private 
DatabaseHelper 
mDbHelper; 
private 
SQLiteDatabase 
mDb 
= 
null; 
private 
Context 
mContext; 
public 
DatabaseUXls(Context 
context) 
{ 
mContext 
= 
context; 
mDbHelper 
= 
new 
DatabaseHelper(mContext, 
DatabaseConsts.DATABASE_NAME, 
null, 
DatabaseConsts.DATABASE_VERSION); 
2014/9/9} 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
OperaXons 
• DatabaseUXls.java 
private 
boolean 
isOpen() 
{ 
if(mDb 
== 
null) 
{ 
return 
false; 
} 
return 
mDb.isOpen(); 
} 
private 
void 
openDatabase() 
{ 
if(isOpen() 
== 
false) 
{ 
mDb 
= 
mDbHelper.getWritableDatabase(); 
} 
} 
public 
void 
closeDatabase() 
{ 
mDb.close(); 
2014/9/9 
} 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
boolean 
insertData(ArrayList<Classmate> 
classmates) 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
long 
count 
= 
0; 
try 
{ 
mDb.beginTransacXon(); 
for(Classmate 
c 
: 
classmates) 
{ 
ContentValues 
values 
= 
new 
ContentValues(); 
values.put(DatabaseConsts.NAME, 
c.name); 
values.put(DatabaseConsts.DESCRIPTION, 
c.descripXon); 
values.put(DatabaseConsts.IMAGE_RESOURCE, 
c.imageRes); 
count 
= 
mDb.insert(DatabaseConsts.TABLE_NAME, 
null, 
values); 
} 
mDb.setTransacXonSuccessful(); 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
e.toString()); 
} 
finally 
{ 
mDb.endTransacXon(); 
} 
closeDatabase(); 
return 
count 
> 
0; 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
boolean 
deleteData(ArrayList<Classmate> 
classmates) 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
long 
count 
= 
0; 
try 
{ 
mDb.beginTransacXon(); 
for(Classmate 
c 
: 
classmates) 
{ 
count 
= 
mDb.delete(DatabaseConsts.TABLE_NAME, 
DatabaseConsts.NAME 
+ 
" 
= 
'" 
+ 
c.name 
+ 
"'", 
null); 
} 
mDb.setTransacXonSuccessful(); 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
e.toString()); 
} 
finally 
{ 
mDb.endTransacXon(); 
} 
closeDatabase(); 
return 
count 
> 
0; 
2014/9/9 
} 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
boolean 
updateData(Classmate 
classmate) 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
long 
count 
= 
0; 
try 
{ 
mDb.beginTransacXon(); 
ContentValues 
values 
= 
new 
ContentValues(); 
values.put(DatabaseConsts.NAME, 
classmate.name); 
values.put(DatabaseConsts.DESCRIPTION, 
classmate.descripXon); 
values.put(DatabaseConsts.IMAGE_RESOURCE, 
classmate.imageRes); 
count 
= 
mDb.update(DatabaseConsts.TABLE_NAME, 
values, 
DatabaseConsts.NAME 
+ 
" 
= 
'" 
+ 
classmate.name 
+ 
"'", 
null); 
mDb.setTransacXonSuccessful(); 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
e.toString()); 
} 
finally 
{ 
mDb.endTransacXon(); 
} 
closeDatabase(); 
return 
count 
> 
0; 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
ArrayList<Classmate> 
getClassmateList() 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
ArrayList<Classmate> 
list 
= 
new 
ArrayList<Classmate>(); 
String 
name, 
descripXon; 
int 
imgRes; 
Cursor 
cursor 
= 
mDb.query(DatabaseConsts.TABLE_NAME, 
new 
String[] 
{}, 
null, 
null, 
null, 
null, 
null); 
if(cursor 
== 
null) 
{ 
Log.e(TAG, 
"Invalid 
query."); 
return 
list; 
} 
try 
{ 
while(cursor.moveToNext()) 
{ 
name 
= 
cursor.getString(cursor.getColumnIndex(DatabaseConsts.NAME)); 
descripXon 
= 
cursor.getString(cursor.getColumnIndex(DatabaseConsts.DESCRIPTION)); 
imgRes 
= 
cursor.getInt(cursor.getColumnIndex(DatabaseConsts.IMAGE_RESOURCE)); 
list.add(new 
Classmate(name, 
descripXon, 
imgRes)); 
} 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
"Search 
classmate 
table 
error 
" 
+ 
e.toString()); 
} 
finally 
{ 
cursor.close(); 
} 
closeDatabase(); 
return 
list; 
2014/9/9 
} 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
Classmate 
getClassmate(String 
name) 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
Classmate 
c 
= 
null; 
String 
descripXon; 
int 
imgRes; 
Cursor 
cursor 
= 
mDb.query(DatabaseConsts.TABLE_NAME, 
new 
String[] 
{}, 
DatabaseConsts.NAME 
+ 
" 
= 
'" 
+ 
name 
+ 
"'", 
null, 
null, 
null, 
null); 
if(cursor 
== 
null) 
{ 
Log.e(TAG, 
"Invalid 
query."); 
return 
null; 
} 
try 
{ 
while(cursor.moveToNext()) 
{ 
descripXon 
= 
cursor.getString(cursor.getColumnIndex(DatabaseConsts.DESCRIPTION)); 
imgRes 
= 
cursor.getInt(cursor.getColumnIndex(DatabaseConsts.IMAGE_RESOURCE)); 
c 
= 
new 
Classmate(name, 
descripXon, 
imgRes); 
} 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
"Search 
classmates 
table 
error 
" 
+ 
e.toString()); 
} 
finally 
{ 
cursor.close(); 
} 
closeDatabase(); 
return 
c; 
2014/9/9 
} 
Copyright 
© 
2014 
MingHo 
Chang
• DatabaseUXls.java 
public 
boolean 
cleanTable() 
{ 
if(isOpen() 
== 
false) 
{ 
openDatabase(); 
} 
long 
count 
= 
0; 
try 
{ 
mDb.beginTransacXon(); 
count 
= 
mDb.delete(DatabaseConsts.TABLE_NAME, 
null, 
null); 
mDb.setTransacXonSuccessful(); 
} 
catch(ExcepXon 
e) 
{ 
Log.i(TAG, 
e.toString()); 
} 
finally 
{ 
mDb.endTransacXon(); 
} 
closeDatabase(); 
return 
count 
> 
0; 
2}0 
14/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
OperaXons 
• DatabaseUXls.java 
public 
void 
deleteTable() 
{ 
mDbHelper.dropTable(mDb); 
mDbHelper.createTable(mDb); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
Insert 
Data 
• FirstAcXvity.java 
-­‐> 
onCreate() 
mDU 
= 
new 
DatabaseUXls(mContext); 
if(sharedPref.contains("database_inited") 
== 
false 
|| 
sharedPref.getBoolean("database_inited", 
false) 
== 
false) 
{ 
initDatabase(); 
editor.putBoolean("database_inited", 
true); 
editor.commit(); 
} 
mClassmates 
= 
mDU.getClassmateList(); 
mListAdapter 
= 
new 
CustomAdapter(this, 
mClassmates); 
mList.setAdapter(mListAdapter); 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
Insert 
Data 
• FirstAcXvity.java 
private 
void 
initDatabase() 
{ 
ArrayList<Classmate> 
classmates 
= 
new 
ArrayList<Classmate>(); 
classmates.add(new 
Classmate("Mary", 
"A 
girl.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Tom", 
"A 
boy.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Mark", 
"A 
boy.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Cindy", 
"A 
girl.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Tiffany", 
"A 
girl.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("John", 
"A 
boy.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Amy", 
"A 
girl.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Annie", 
"A 
girl.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Jimmy", 
"A 
boy.", 
R.drawable.person_1)); 
classmates.add(new 
Classmate("Eddie", 
"A 
boy.", 
R.drawable.person_1)); 
mDU.insertData(classmates); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
2nd 
ImplementaXon 
• Use 
database 
to 
hold 
data. 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
Database(SQLite) 
– 
Update 
Data 
• FirstAcXvity.java 
-­‐> 
CustomReceiver 
-­‐> 
onReceive 
updateDatabase(mClassmates.get(posiXon)); 
• FirstAcXvity.java 
private 
void 
updateDatabase(Classmate 
classmate) 
{ 
mDU.updateData(classmate); 
} 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang
3rd 
ImplementaXon 
• Update 
data 
to 
database. 
2014/9/9 
Copyright 
© 
2014 
MingHo 
Chang

Android - Data Storage

  • 1.
    Data Storage 2014/9/9 Copyright © 2014 MingHo Chang
  • 2.
    張明禾 • C • Android App • NodeJS • Sencha Touch • Unity 2014/9/9 Copyright © 2014 MingHo Chang
  • 3.
    Data Storage •Shared preferences files – Saving key-­‐value pairs of simple data. – Private or shared • Android file system – Saving arbitrary files. – Read/Write in order. • Database – Saving structured data. 2014/9/9 Copyright © 2014 MingHo Chang
  • 4.
    SharedPreferences • Key-­‐value pair of data • Can be either private or shared 2014/9/9 Copyright © 2014 MingHo Chang
  • 5.
    SharedPreferences – Get handle • Use only one shared preferences file – PreferenceManager.getDefaultPreferences(context) – getPreferences(Context.MODE_PRIVATE) • Use mulXple shared preferences files – getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE) • Example SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mCo ntext); 2014/9/9 Copyright © 2014 MingHo Chang
  • 6.
    SharedPreferences • Accessibility – MODE_PRIVATE – MODE_WORLD_READABLE – MODE_WORLD_WRITEABLE 2014/9/9 Copyright © 2014 MingHo Chang
  • 7.
    SharedPreferences – Write • SharedPreferences.Editor SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(“saved_high_score”, 100); editor.commit(); 2014/9/9 Copyright © 2014 MingHo Chang
  • 8.
    SharedPreferences – Read int defaultValue = 60; int highScore = sharedPref.getInt(“saved_high_score”, defaultValue); 2014/9/9 Copyright © 2014 MingHo Chang
  • 9.
    SharedPreferences • FirstAcXvity.java SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(mContext); SharedPreferences.Editor editor = sharedPref.edit(); for(int i = 0; i < mClassmates.size(); i++) { String name = mClassmates.get(i).name; if(sharedPref.contains(name) == true) { if(sharedPref.getBoolean(name, false) == true) { // Toast name + “has been updated” } } else { editor.putBoolean(name, false); } } editor.commit(); 2014/9/9 Copyright © 2014 MingHo Chang
  • 10.
    SharedPreferences • SecondAcXvity.java SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences( mContext); SharedPreferences.Editor editor = sharedPref.edit(); editor.putBoolean(mName, true); editor.commit(); 2014/9/9 Copyright © 2014 MingHo Chang
  • 11.
    1st ImplementaXon •Save update status of every classmate in default shared preferences file. • Toast classmates’ names that have been updated when the app starts. 2014/9/9 Copyright © 2014 MingHo Chang
  • 12.
    File • Internal Storage – Accessible by only your app by default. – Removed when your app is uninstalled. • External Storage – World-­‐readable 2014/9/9 Copyright © 2014 MingHo Chang
  • 13.
    File – Internal Storage String filename = "myfile”, str = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(str.getBytes()); outputStream.close(); } catch (ExcepXon e) { e.printStackTrace(); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 14.
    File – External Storage • Permission <manifest ...> <uses-­‐permission android:name="android.permission.WRITE_EXTERN AL_STORAGE" /> <uses-­‐permission android:name="android.permission.READ_EXTERNA L_STORAGE" /> ... </manifest> 2014/9/9 Copyright © 2014 MingHo Chang
  • 15.
    File – External Storage • Verify that the volume is available before accessing it – getExternalStorageState() • Environment.MEDIA_MOUNTED • Environment.MEDIA_MOUNTED_READ_ONLY 2014/9/9 Copyright © 2014 MingHo Chang
  • 16.
    File – External Storage • Public files Environment.getExternalStoragePublicDirectory(Env ironment.DIRECTORY_PICTURES) • Private files context.getExternalFilesDir(Environment.DIRECTOR Y_PICTURES) 2014/9/9 Copyright © 2014 MingHo Chang
  • 17.
    File – Delete • myFile.delete(); • context.deleteFile(fileName); 2014/9/9 Copyright © 2014 MingHo Chang
  • 18.
    Database(SQLite) – Structure • Constants • SQLiteOpenHelper • OperaXons 2014/9/9 Copyright © 2014 MingHo Chang
  • 19.
    Database(SQLite) -­‐ Constants • DATABASE_NAME • DATABASE_VERSION • Table field names 2014/9/9 Copyright © 2014 MingHo Chang
  • 20.
    Database(SQLite) -­‐ Constants • DatabaseConsts.java public class DatabaseConsts implements BaseColumns { public final staXc String DATABASE_NAME = "android.db"; public final staXc int DATABASE_VERSION = 1; public final staXc String TABLE_NAME = "classmates"; public final staXc String NAME = "name"; public final staXc String DESCRIPTION = "descripXon"; public final staXc String IMAGE_RESOURCE = "image_resource"; } 2014/9/9 Copyright © 2014 MingHo Chang
  • 21.
    Database(SQLite) – SQLiteOpenHelper • Create table – onCreate() • Upgrade table – onUpgrade() 2014/9/9 Copyright © 2014 MingHo Chang
  • 22.
    Database(SQLite) – SQLiteOpenHelper • DatabaseHelper.java public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { createTable(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { dropTable(db); onCreate(db); } } 2014/9/9 Copyright © 2014 MingHo Chang
  • 23.
    Database(SQLite) – SQLiteOpenHelper • DatabaseHelper.java private void createTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE IF NOT EXISTS " + DatabaseConsts.TABLE_NAME + " (” + DatabaseConsts._ID + " INTEGER PRIMARY KEY,” + DatabaseConsts.NAME + " TEXT,” + DatabaseConsts.DESCRIPTION + " TEXT,” + DatabaseConsts.IMAGE_RESOURCE + " INTEGER” + ");"); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 24.
    Database(SQLite) – SQLiteOpenHelper • DatabaseHelper.java public void dropTable(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + DatabaseConsts.TABLE_NAME); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 25.
    Database(SQLite) – OperaXons • Open database • Insert data • Update data • Get data • Delete data 2014/9/9 Copyright © 2014 MingHo Chang
  • 26.
    Database(SQLite) – OperaXons • DatabaseUXls.java public class DatabaseUXls { private staXc final String TAG = DatabaseUXls.class.getSimpleName(); private DatabaseHelper mDbHelper; private SQLiteDatabase mDb = null; private Context mContext; public DatabaseUXls(Context context) { mContext = context; mDbHelper = new DatabaseHelper(mContext, DatabaseConsts.DATABASE_NAME, null, DatabaseConsts.DATABASE_VERSION); 2014/9/9} Copyright © 2014 MingHo Chang
  • 27.
    Database(SQLite) – OperaXons • DatabaseUXls.java private boolean isOpen() { if(mDb == null) { return false; } return mDb.isOpen(); } private void openDatabase() { if(isOpen() == false) { mDb = mDbHelper.getWritableDatabase(); } } public void closeDatabase() { mDb.close(); 2014/9/9 } Copyright © 2014 MingHo Chang
  • 28.
    • DatabaseUXls.java public boolean insertData(ArrayList<Classmate> classmates) { if(isOpen() == false) { openDatabase(); } long count = 0; try { mDb.beginTransacXon(); for(Classmate c : classmates) { ContentValues values = new ContentValues(); values.put(DatabaseConsts.NAME, c.name); values.put(DatabaseConsts.DESCRIPTION, c.descripXon); values.put(DatabaseConsts.IMAGE_RESOURCE, c.imageRes); count = mDb.insert(DatabaseConsts.TABLE_NAME, null, values); } mDb.setTransacXonSuccessful(); } catch(ExcepXon e) { Log.i(TAG, e.toString()); } finally { mDb.endTransacXon(); } closeDatabase(); return count > 0; } 2014/9/9 Copyright © 2014 MingHo Chang
  • 29.
    • DatabaseUXls.java public boolean deleteData(ArrayList<Classmate> classmates) { if(isOpen() == false) { openDatabase(); } long count = 0; try { mDb.beginTransacXon(); for(Classmate c : classmates) { count = mDb.delete(DatabaseConsts.TABLE_NAME, DatabaseConsts.NAME + " = '" + c.name + "'", null); } mDb.setTransacXonSuccessful(); } catch(ExcepXon e) { Log.i(TAG, e.toString()); } finally { mDb.endTransacXon(); } closeDatabase(); return count > 0; 2014/9/9 } Copyright © 2014 MingHo Chang
  • 30.
    • DatabaseUXls.java public boolean updateData(Classmate classmate) { if(isOpen() == false) { openDatabase(); } long count = 0; try { mDb.beginTransacXon(); ContentValues values = new ContentValues(); values.put(DatabaseConsts.NAME, classmate.name); values.put(DatabaseConsts.DESCRIPTION, classmate.descripXon); values.put(DatabaseConsts.IMAGE_RESOURCE, classmate.imageRes); count = mDb.update(DatabaseConsts.TABLE_NAME, values, DatabaseConsts.NAME + " = '" + classmate.name + "'", null); mDb.setTransacXonSuccessful(); } catch(ExcepXon e) { Log.i(TAG, e.toString()); } finally { mDb.endTransacXon(); } closeDatabase(); return count > 0; } 2014/9/9 Copyright © 2014 MingHo Chang
  • 31.
    • DatabaseUXls.java public ArrayList<Classmate> getClassmateList() { if(isOpen() == false) { openDatabase(); } ArrayList<Classmate> list = new ArrayList<Classmate>(); String name, descripXon; int imgRes; Cursor cursor = mDb.query(DatabaseConsts.TABLE_NAME, new String[] {}, null, null, null, null, null); if(cursor == null) { Log.e(TAG, "Invalid query."); return list; } try { while(cursor.moveToNext()) { name = cursor.getString(cursor.getColumnIndex(DatabaseConsts.NAME)); descripXon = cursor.getString(cursor.getColumnIndex(DatabaseConsts.DESCRIPTION)); imgRes = cursor.getInt(cursor.getColumnIndex(DatabaseConsts.IMAGE_RESOURCE)); list.add(new Classmate(name, descripXon, imgRes)); } } catch(ExcepXon e) { Log.i(TAG, "Search classmate table error " + e.toString()); } finally { cursor.close(); } closeDatabase(); return list; 2014/9/9 } Copyright © 2014 MingHo Chang
  • 32.
    • DatabaseUXls.java public Classmate getClassmate(String name) { if(isOpen() == false) { openDatabase(); } Classmate c = null; String descripXon; int imgRes; Cursor cursor = mDb.query(DatabaseConsts.TABLE_NAME, new String[] {}, DatabaseConsts.NAME + " = '" + name + "'", null, null, null, null); if(cursor == null) { Log.e(TAG, "Invalid query."); return null; } try { while(cursor.moveToNext()) { descripXon = cursor.getString(cursor.getColumnIndex(DatabaseConsts.DESCRIPTION)); imgRes = cursor.getInt(cursor.getColumnIndex(DatabaseConsts.IMAGE_RESOURCE)); c = new Classmate(name, descripXon, imgRes); } } catch(ExcepXon e) { Log.i(TAG, "Search classmates table error " + e.toString()); } finally { cursor.close(); } closeDatabase(); return c; 2014/9/9 } Copyright © 2014 MingHo Chang
  • 33.
    • DatabaseUXls.java public boolean cleanTable() { if(isOpen() == false) { openDatabase(); } long count = 0; try { mDb.beginTransacXon(); count = mDb.delete(DatabaseConsts.TABLE_NAME, null, null); mDb.setTransacXonSuccessful(); } catch(ExcepXon e) { Log.i(TAG, e.toString()); } finally { mDb.endTransacXon(); } closeDatabase(); return count > 0; 2}0 14/9/9 Copyright © 2014 MingHo Chang
  • 34.
    Database(SQLite) – OperaXons • DatabaseUXls.java public void deleteTable() { mDbHelper.dropTable(mDb); mDbHelper.createTable(mDb); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 35.
    Database(SQLite) – Insert Data • FirstAcXvity.java -­‐> onCreate() mDU = new DatabaseUXls(mContext); if(sharedPref.contains("database_inited") == false || sharedPref.getBoolean("database_inited", false) == false) { initDatabase(); editor.putBoolean("database_inited", true); editor.commit(); } mClassmates = mDU.getClassmateList(); mListAdapter = new CustomAdapter(this, mClassmates); mList.setAdapter(mListAdapter); 2014/9/9 Copyright © 2014 MingHo Chang
  • 36.
    Database(SQLite) – Insert Data • FirstAcXvity.java private void initDatabase() { ArrayList<Classmate> classmates = new ArrayList<Classmate>(); classmates.add(new Classmate("Mary", "A girl.", R.drawable.person_1)); classmates.add(new Classmate("Tom", "A boy.", R.drawable.person_1)); classmates.add(new Classmate("Mark", "A boy.", R.drawable.person_1)); classmates.add(new Classmate("Cindy", "A girl.", R.drawable.person_1)); classmates.add(new Classmate("Tiffany", "A girl.", R.drawable.person_1)); classmates.add(new Classmate("John", "A boy.", R.drawable.person_1)); classmates.add(new Classmate("Amy", "A girl.", R.drawable.person_1)); classmates.add(new Classmate("Annie", "A girl.", R.drawable.person_1)); classmates.add(new Classmate("Jimmy", "A boy.", R.drawable.person_1)); classmates.add(new Classmate("Eddie", "A boy.", R.drawable.person_1)); mDU.insertData(classmates); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 37.
    2nd ImplementaXon •Use database to hold data. 2014/9/9 Copyright © 2014 MingHo Chang
  • 38.
    Database(SQLite) – Update Data • FirstAcXvity.java -­‐> CustomReceiver -­‐> onReceive updateDatabase(mClassmates.get(posiXon)); • FirstAcXvity.java private void updateDatabase(Classmate classmate) { mDU.updateData(classmate); } 2014/9/9 Copyright © 2014 MingHo Chang
  • 39.
    3rd ImplementaXon •Update data to database. 2014/9/9 Copyright © 2014 MingHo Chang