Data storage

  • 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 storage
  • mContext.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.

mContext.getExternalFilesDir(), mContext.getExternalCacheDir()
Public storage of somedata

example: Pictures/your_app

Files will NOT be deleted if you delete a app.

Environment.getExternalStoragePublicDirectory()
flashcard

example: mnt/sdcard/Android/data/data/your_package/mnt/sdcard/Pictures/your_application/


There are some content dependent types of directory

mContext.getExternalFilesDir(String type) 
Environment.getExternalStoragePublicDirectory(String type)

DIRECTORY_MUSIC
DIRECTORY_PODCASTS
DIRECTORY_RINGTONES
DIRECTORY_ALARMS
DIRECTORY_NOTIFICATIONS
DIRECTORY_PICTURES
DIRECTORY_MOVIES
DIRECTORY_DOWNLOADS
DIRECTORY_DCIM
DIRECTORY_DOCUMENTS

Read/write

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

Read only

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

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

SharedPreferences mPref = mContext.getSharedPreferences(“file_name”, Context.MODE_PRIVATE);

– common options, available fron any components of the app

SharedPreferences mPref = mActivity.getPreferences(Context.MODE_PRIVATE);

– 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
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;
}
SQLiteOpenHelper
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
    }
}

Create

// 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);

Read

// 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();

Update

// 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)

Delete

// 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);