- file storage
- SharedPreferences
- SQLite database
FileStorage
- internal – private
- external – public
Internal
Access mode by default is MODE_PRIVATE
Before Android 7.0 also: MODE_APPEND, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE
Since Android 7.0 we should use FileProvider
Files will be deleted if you delete a app.
Methods:
mContext.getFilesDir()– to get private dir in storagemContext.getCacheDir()– to get private dir for save temp files. The files can be deleted by OS, but a developer have to delete these files by himself.
External
Public storage of app
example: Android/data/data/your_package
Files will be deleted if you delete a app.
The files is accessable to all apps.
[code language="java"] mContext.getExternalFilesDir(), mContext.getExternalCacheDir() [/code]
Public storage of somedata
example: Pictures/your_app
Files will NOT be deleted if you delete a app.
[code language="java"] Environment.getExternalStoragePublicDirectory() [/code]
flashcard
example: mnt/sdcard/Android/data/data/your_package/, mnt/sdcard/Pictures/your_application/
There are some content dependent types of directory
[code language="java"] mContext.getExternalFilesDir(String type) Environment.getExternalStoragePublicDirectory(String type) [/code]
DIRECTORY_MUSIC
DIRECTORY_PODCASTS
DIRECTORY_RINGTONES
DIRECTORY_ALARMS
DIRECTORY_NOTIFICATIONS
DIRECTORY_PICTURES
DIRECTORY_MOVIES
DIRECTORY_DOWNLOADS
DIRECTORY_DCIM
DIRECTORY_DOCUMENTS
Read/write
[code]
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
[/code]
Read only
[code]
<manifest ...>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
[/code]
Since 4.4 it is not required to ask permissions if you use only public storage of app Android/data/data/your_package/
Since 7.0 we can ask access to certain public dirs (Scoped Directory Access)
SharedPreferences
it is a file of key-value
key – string
value – boolean, int, long, float, string
[code language="java"] SharedPreferences mPref = mContext.getSharedPreferences(“file_name”, Context.MODE_PRIVATE); [/code]
– common options, available fron any components of the app
[code language="java"] SharedPreferences mPref = mActivity.getPreferences(Context.MODE_PRIVATE); [/code]
– options of specific activity, available fron any components of the app
SQLite
- full sql
- onefile database
- opensource
- max size – 140 Tb
- max size of string – 1 Gb
- ACID transaction
data type:
- null
- integer
- real
- text
- blob
[code language="java"]
public final class FeedReaderContract {
private FeedReaderContract() {}
public static class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
}
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
FeedEntry._ID + " INTEGER PRIMARY KEY," +
FeedEntry.COLUMN_NAME_TITLE + " TEXT," +
FeedEntry.COLUMN_NAME_SUBTITLE + " TEXT)";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;
}
[/code]
SQLiteOpenHelper
[code language="java"]
public class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
// Do update database
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Do update database
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Do update database
}
}
[/code]
Create
[code language="java"] // Obtain connection for writing SQLiteDatabase db = mDbHelper.getWritableDatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(FeedEntry.COLUMN_NAME_TITLE, title); values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle); // Issue SQL ‘insert’ statement long newRowId = db.insert(FeedEntry.TABLE_NAME, null, values); [/code]
Read
[code language="java"]
// Obtain connection for reading
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// The columns to return
String[] projection = {
FeedEntry._ID,
FeedEntry.COLUMN_NAME_TITLE,
FeedEntry.COLUMN_NAME_SUBTITLE};
// The columns for the WHERE clause
String selection = FeedEntry.COLUMN_NAME_TITLE + " = ?";
// The values for the WHERE clause
String[] selectionArgs = { "My Title" };
// The sort order
String sortOrder = FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";
// Issue SQL ‘query’ statement
Cursor cursor = db.query(FeedEntry.TABLE_NAME, projection, selection, selectionArgs,
null, null, sortOrder);
// cursor
List itemIds = new ArrayList<>();
// loop
while(cursor.moveToNext()) {
// get value
long itemId = cursor.getLong(
cursor.getColumnIndexOrThrow(FeedEntry._ID));
itemIds.add(itemId);
}
cursor.close();
[/code]
Update
[code language="java"]
// Obtain connection for writing
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_SUBTITLE, subtitle);
// The columns for the WHERE clause
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// The values for the WHERE clause
String[] selectionArgs = { "MyTitle" };
// Issue SQL ‘update’ statement
long rowCountAffected = db.update(FeedEntry.TABLE_NAME, values, selection, selectionArgs)
[/code]
Delete
[code language="java"]
// Obtain connection for writing
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// The columns for the WHERE clause
String selection = FeedEntry.COLUMN_NAME_TITLE + " LIKE ?";
// The values for the WHERE clause
String[] selectionArgs = { "MyTitle" };
// Issue SQL delete statement
long rowCountAffected = db.delete(FeedEntry.TABLE_NAME, selection, selectionArgs);
[/code]