SlideShare a Scribd company logo
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

More Related Content

PPTX
SQLite database in android
PDF
Android ui menu
PPTX
Broadcast Receiver
PPT
ASP.NET 08 - Data Binding And Representation
PPT
Shared preferences
PDF
Android datastorage
PPTX
Android share preferences
PPTX
Presentation on Android application life cycle and saved instancestate
SQLite database in android
Android ui menu
Broadcast Receiver
ASP.NET 08 - Data Binding And Representation
Shared preferences
Android datastorage
Android share preferences
Presentation on Android application life cycle and saved instancestate

What's hot (20)

PPTX
Database in Android
PPTX
Exception handling in c++
PDF
Android animation
PPTX
Asp.net html server control
PPTX
Content provider in_android
PPTX
android sqlite
PPTX
JAVA AWT
PPTX
Sqlite
PPTX
Android Architecture.pptx
PPT
Android application structure
PPTX
Apache maven 2 overview
PPTX
Event handling
PDF
Broadcast Receivers in Android
PPT
Design patterns ppt
PPS
Wrapper class
PPTX
Introduction à React JS
PDF
004 - JavaFX Tutorial - Event Handling
DOCX
Android-dialogs in android-chapter14
PPTX
Android Data Storagefinal
Database in Android
Exception handling in c++
Android animation
Asp.net html server control
Content provider in_android
android sqlite
JAVA AWT
Sqlite
Android Architecture.pptx
Android application structure
Apache maven 2 overview
Event handling
Broadcast Receivers in Android
Design patterns ppt
Wrapper class
Introduction à React JS
004 - JavaFX Tutorial - Event Handling
Android-dialogs in android-chapter14
Android Data Storagefinal
Ad

Similar to Android - Data Storage (20)

PPT
Persistences
PDF
Android Data Persistence
PPT
Data Storage In Android
PPTX
Integration patterns in AEM 6
KEY
Data Abstraction for Large Web Applications
PDF
Take the Plunge with OOP from #pnwphp
PPTX
12_Data_Storage_Part_2.pptx
PPTX
Save data in to sqlite
ODP
Android App Development - 09 Storage
PDF
Android - Saving data
PPTX
Storage Plug-ins
PDF
Android Jetpack: Room persistence library
PDF
Building node.js applications with Database Jones
PPTX
Mobile Application Development (Shared Preferences) class-06
DOCX
Android-data storage in android-chapter21
PPTX
Spring dependency injection
PPTX
Core Data Migrations and A Better Option
PDF
the Spring 4 update
PPTX
CloudStack Meetup Santa Clara
PDF
OOP in PHP
Persistences
Android Data Persistence
Data Storage In Android
Integration patterns in AEM 6
Data Abstraction for Large Web Applications
Take the Plunge with OOP from #pnwphp
12_Data_Storage_Part_2.pptx
Save data in to sqlite
Android App Development - 09 Storage
Android - Saving data
Storage Plug-ins
Android Jetpack: Room persistence library
Building node.js applications with Database Jones
Mobile Application Development (Shared Preferences) class-06
Android-data storage in android-chapter21
Spring dependency injection
Core Data Migrations and A Better Option
the Spring 4 update
CloudStack Meetup Santa Clara
OOP in PHP
Ad

Recently uploaded (20)

PPTX
Big Data Technologies - Introduction.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Machine learning based COVID-19 study performance prediction
PDF
cuic standard and advanced reporting.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Encapsulation theory and applications.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Approach and Philosophy of On baking technology
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Big Data Technologies - Introduction.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
Machine learning based COVID-19 study performance prediction
cuic standard and advanced reporting.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Understanding_Digital_Forensics_Presentation.pptx
Encapsulation_ Review paper, used for researhc scholars
Encapsulation theory and applications.pdf
Spectral efficient network and resource selection model in 5G networks
20250228 LYD VKU AI Blended-Learning.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Approach and Philosophy of On baking technology
Review of recent advances in non-invasive hemoglobin estimation
Programs and apps: productivity, graphics, security and other tools
sap open course for s4hana steps from ECC to s4
Chapter 3 Spatial Domain Image Processing.pdf
MIND Revenue Release Quarter 2 2025 Press Release
NewMind AI Weekly Chronicles - August'25 Week I
Profit Center Accounting in SAP S/4HANA, S4F28 Col11

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