Data Storage in Android: Lecturer: Trần Hồng Nghi Email: [email protected]
Data Storage in Android: Lecturer: Trần Hồng Nghi Email: [email protected]
//get the preferences, then editor, set a data //get the preferences then retrieve
item saved data, specifying a default value
SharedPreferences appPrefs = SharedPreferences appPrefs =
getSharedPreferences("MyAppPrefs", 0); getSharedPreferences("MyAppPrefs",
SharedPreferences.Editor prefsEd = 0);
appPrefs.edit(); String savedData =
prefsEd.putString("dataString", "some string appPrefs.getString("dataString", "");
data");
prefsEd.commit();
Using Preferences API calls(cont.)
Path of Preferences xml file.
Android puts SharedPreferences XML files in the
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PR
EFS_NAME.xml
OR
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PA
CKAGE_NAME_preferences.xml
An application or package usually has its own:
Example
Saving/Retrieving a SharedPreference Object holding
UI user choices.
Example(cont.)
Using DDMS to explore the Device’s memory map. Observe the choices
made by the user are saved in the data/data/Shared_prefs/ folder as an
XML file.
File xml
Example(cont.)
Example(cont.)
Example(cont.)
Example(cont.)
Internal Storage:
You can save files directly on the device's internal storage. By default,
files saved to the internal storage are private to your application and
other applications cannot access them (nor can the user). When the
user uninstalls your application, these files are removed.
Android provides a convenience method on Context to get a
FileOutputStream— namely openFileOutput(String name, int mode)
create and write a private file to the internal storage:
1. Call openFileOutput() with the name of the file and the operating
mode. This returns a FileOutputStream. That file will ultimately be
stored at the data/data/[PACKAGE_NAME]/files/file.name path on
the platform.
2. Write to the file with write().
3. Close the stream with close().
MODE_PRIVATE
MODE_PRIVATE will create the file (or replace a file
of the same name) and make it private to your
application. Other modes available are: MODE_APPEND
, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE.
Tip: If you want to save a static file in your
application at compile time, save the file in your
project res/raw/directory. You can open it with
openRawResource(), passing
the R.raw.<filename> resource ID. This method
returns an InputStream that you can use to read the
file (but you cannot write to the original file).
Saving cache file
If you'd like to cache some data, rather than store it
persistently, you should use getCacheDir() to open a
Filethat represents the internal directory where your
application should save temporary cache files.
When the device is low on internal storage space,
Android may delete these cache files to recover space.
However, you should not rely on the system to clean
up these files for you. You should always maintain the
cache files yourself and stay within a reasonable limit
of space consumed, such as 1M.
When the user uninstalls your application, these files
are removed.
Other useful methods
getFilesDir() Gets the absolute path to the
filesystem directory where your internal files are
saved.
getDir()Creates (or opens an existing) directory
within your internal storage space.
deleteFile()Deletes a file saved on the internal
storage.
fileList()Returns an array of files currently saved
by your application.
Using Android Resource Files
When an application’s .apk bytecode is deployed it may store
in memory: code, drawables, and other raw resources (such
as files). Acquiring those resources could be done using a
statement such as:
External Storage
Every Android-compatible device supports a shared "external storage"
that you can use to save files. This can be a removable storage media
(such as an SD card) or an internal (non-removable) storage.
Files saved to the external storage are world-readable and can be
modified by the user when they enable USB mass storage to transfer
files on a computer.
Before you do any work with the external storage, you should always
call getExternalStorageState() to check whether the media is available.
The media might be mounted to a computer, missing, read-only, or in
some other state.
Caution: External storage can become unavailable if the user mounts
the external storage on a computer or removes the media, and there's
no security enforced upon files you save to the external storage. All
applications can read and write files placed on the external storage
and the user can remove them.
External Storage(cont.)
SDK1.6 it is necessary to request permission to write to the SD card. Add the following
clause to your AndroidManifest.xml
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
Example: Checking media availability
Example: Create file on External Storage
Accessing files on external storage
Using API Level 8 or greater, use getExternalFilesDir() to open a File that
represents the external storage directory .
This method takes a type parameter that specifies the type of subdirectory
you want, such as:
DIRECTORY_MUSIC
DIRECTORY_RINGTONES
This method will create the appropriate directory if necessary. By specifying the
type of directory, you ensure that the Android's media scanner will properly
categorize your files in the system (for example, ringtones are identified as
ringtones and not music).
Using API Level 7 or lower, use getExternalStorageDirectory(), to open a File
representing the root of the external storage. You should then write your
data in the following directory:
/Android/data/<package_name>/files/
The <package_name> is your Java-style package name, such as
"com.example.android.app“.
• If the user uninstalls your application, this directory and all its contents will be
deleted.
Saving files that should be shared
If you want to save files that are not specific to your application and that
should not be deleted when your application is uninstalled, save them to one
of the public directories on the external storage. These directories lay at the
root of the external storage, such as Music/, Pictures/, Ringtones/, and others.
In API Level 8 or greater, usegetExternalStoragePublicDirectory() else
use getExternalStorageDirectory() to open a File.
Save your shared files in one of the following directories:
Music/ - Media scanner classifies all media found here as user music.
Podcasts/ - Media scanner classifies all media found here as a podcast.
Ringtones/ - Media scanner classifies all media found here as a ringtone.
Alarms/ - Media scanner classifies all media found here as an alarm sound.
Notifications/ - Media scanner classifies all media found here as a notification
sound.
Pictures/ - All photos (excluding those taken with the camera).
Movies/ - All movies (excluding those taken with the camcorder).
Download/ - Miscellaneous downloads.
Saving cache files
using API Level 8 or greater, use
getExternalCacheDir() to open a File that represents
the external storage directory where you should save
cache files. If the user uninstalls your application,
these files will be automatically deleted.
If you're using API Level 7 or lower, use
getExternalStorageDirectory() to open a File that
represents the root of the external storage, then
write your cache data in the following directory:
/Android/data/<package_name>/cache/
The <package_name> is your Java-style package
name, such as "com.example.android.app".
Content Provider & SQLite
Content Provider
SQLite
Content Provider
Content providers allow programs access to data which is present
on the device.
34
Content URI
A content URI is a URI that identifies data in a
provider.
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI
Content Provider
ContentResolver
ContentResolver cr = getContentResolver();
36
Content Provider
ContentResolver cr = getContentResolver();
// Trả về những dòng có cột thứ 3 bằng giá trị cho trước
// và theo thứ tự của cột thứ 5
String where = KEY_COL3 + "=" + requiredValue;
String order = KEY_COL5;
37
Example: contact
Activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lv"
></ListView>
</RelativeLayout>
Example row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/textValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
Example
Set permission to access data
<uses-permission
android:name="android.permission.RE
AD_CONTACTS"/>
Example
MainActivity.java
SQLite
SQLite Databases:
SQLite is an open source database that is stable, and
is popular on many small devices, including Android.
SQLite is a great fit for Android app development:
It’s a zero-configuration database.
It doesn’t have a server.
It’s a single-file database.
It’s open source
Classes
SQLiteOpenHelper
To manage database creation, and version management.
http://developer.android.com/reference/android/database/sqlite/SQLi
teOpenHelper.html
SQLiteDatabase
To manage SQLite DB
http://developer.android.com/reference/android/database/sqlite/SQLi
teDatabase.html
Database Location
Emulator’s File Explorer showing the placement of the
database
SQLite statement
Create table
create table <name table>( Colum 1 <Data type >,
Colum 2<Data type >,
Colum 3<Data type >,
. . . . . . .);
Insert data
insert into <name table > [(colum)] values(<value>);
● Delete data
Delete from < name table > [where <condition> ];
● Update
Update <name table> set <colum name>=<value>[,< colum name
t>=< value >, . . ]
[where <condition>];
How to create a SQLite database?
Method 1