5cosc005w mobile application development lecture 8: …

46
5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: Data Storage - Part II Dr Dimitris C. Dracopoulos Module Web page: https://dracopd.users.ecs.westminster.ac.uk/DOCUM/courses/5cosc005w/5cosc005w.html This material is based on Android Developer Fundamentals 2 by Google used under a Creative Commons Attribution 4.0 International license.

Upload: others

Post on 09-Jan-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

5COSC005W MOBILE APPLICATIONDEVELOPMENT

Lecture 8: Data Storage - Part II

Dr Dimitris C. Dracopoulos

Module Web page:

https://dracopd.users.ecs.westminster.ac.uk/DOCUM/courses/5cosc005w/5cosc005w.html

This material is based on Android Developer Fundamentals 2 by Google used under

a Creative Commons Attribution 4.0 International license.

Page 2: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Data Storage

1

Page 3: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Storage Options

2

Page 4: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Storing data

● SQLite Databases—Structured data in a private database

● Shared Preferences—Private primitive data in key-value pairs

● Internal Storage—Private data on device memory

● External Storage—Public data on device or external storage

● Content Providers—Store privately and make available publicly

3

Page 5: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Storing data beyond Android

● Network Connection—On the web with your own server

● Cloud Backup—Back up app and user data in the cloud

● Firebase Realtime Database—Store and sync data with NoSQL cloud database across clients in realtime

4

Page 6: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

SQLite Database

● Ideal for repeating or structured data, such as contacts ● Android provides SQL-like database● Covered in previous week

5

Page 7: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Files

6

Page 8: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Android File System

● External storage -- Public directories

● Internal storage -- Private directories for just your app

Apps can browse the directory structure

Structure and operations similar to Linux and java.io

7

Page 9: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Internal storage

● Always available

● Uses device's filesystem

● Only your app can access files, unless explicitly set to be readable or writable

● On app uninstall, system removes all app's files from internal storage

8

Page 10: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

External storage

9

● Not always available, can be removed

● Uses device's file system or physically external storage like SD card

● World-readable, so any app can read

● On uninstall, system does not remove files private to app

Page 11: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

When to use internal/external storage

Internal is best when● you want to be sure that neither the user nor other apps

can access your files

External is best for files that● don't require access restrictions and for ● you want to share with other apps● you allow the user to access with a computer

10

Page 12: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Save user's file in shared storage

● Save new files that the user acquires through your app to a public directory where other apps can access them and the user can easily copy them from the device

● Save external files in public directories

11

Page 13: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Internal Storage

12

Page 14: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Internal Storage

● Uses private directories just for your app

● App always has permission to read/write

● Permanent storage directory—getFilesDir()

● Temporary storage directory—getCacheDir()

13

Page 15: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Creating a file

File file = new File(

context.getFilesDir(), filename);

Use standard java.io file operators or streams to interact with files

14

Page 16: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

External Storage

15

Page 17: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

External Storage● On device or SD card

● Set permissions in Android Manifest○ Write permission includes read permission

<uses-permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission

android:name="android.permission.READ_EXTERNAL_STORAGE" />

16

Page 18: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Always check availability of storage

public boolean isExternalStorageWritable() {

String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {

return true;

}

return false;

}

17

Page 19: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Example external public directories

● DIRECTORY_ALARMS and DIRECTORY_RINGTONESFor audio files to use as alarms and ringtones

● DIRECTORY_DOCUMENTSFor documents that have been created by the user

● DIRECTORY_DOWNLOADSFor files that have been downloaded by the user

18

developer.android.com/reference/android/os/Environment.html

Page 20: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Accessing public external directories

1. Get a path getExternalStoragePublicDirectory()

2. Create file

File path = Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES);

File file = new File(path, "DemoPicture.jpg");

19

Page 21: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

How much storage left?

● If there is not enough space, throws IOException

● If you know the size of the file, check against space○ getFreeSpace()○ getTotalSpace().

● If you do not know how much space is needed○ try/catch IOException

20

Page 22: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Delete files no longer needed

● External storage

myFile.delete();

● Internal storage

myContext.deleteFile(fileName);

21

Page 23: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Do not delete the user's files!

When the user uninstalls your app, your app's private storage directory and all its contents are deleted

Do not use private storage for content that belongs to the user!

For example

● Photos captured or edited with your app● Music the user has purchased with your app

22

Page 24: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Shared Preferences

23

Page 25: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Shared Preferences

● Read and write small amounts of primitive data as key/value pairs to a file on the device storage

● Covered in later here

24

Page 26: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Other Storage Options

25

Page 27: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Use Firebase to store and share data

Store and sync data with the Firebase cloud database

Data is synced across all clients, and remains available when your app goes offline

firebase.google.com/docs/database/

26

Page 28: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Firebase Realtime Database

27

● Connected apps share data

● Hosted in the cloud

● Data is stored as JSON

● Data is synchronized in realtime to every connected client

Page 29: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Data storageAndroid Developer Fundamentals V2This work is licensed under a Creative Commons Attribution 4.0 International License.

Network Connection

● You can use the network (when it's available) to store and retrieve data on your own web-based services

● Use classes in the following packages○ java.net.*○ android.net.*

28

Page 30: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Shared Preferences

29

Page 31: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

What is Shared Preferences?

● Read and write small amounts of primitive data as key/value pairs to a file on the device storage

● SharedPreference class provides APIs for reading, writing, and managing this data

● Save data in onPause()restore in onCreate()

30

Page 32: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Shared Preferences and Saved Instance State

31

● Small number of key/value pairs

● Data is private to the application

Shared Preferences AND Saved Instance State

Page 33: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Shared Preferences vs. Saved Instance State

32

● Persist data across user sessions, even if app is killed and restarted, or device is rebooted

● Data that should be remembered across sessions, such as a user's preferred settings or their game score

● Common use is to store user preferences

● Preserves state data across activity instances in same user session

● Data that should not be remembered across sessions, such as the currently selected tab or current state of activity.

● Common use is to recreate state after the device has been rotated

Shared Preferences vs. Saved Instance State

Page 34: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Creating Shared Preferences

● Need only one Shared Preferences file per app

● Name it with package name of your app—unique and easy to associate with app

● MODE argument for getSharedPreferences() is for backwards compatibility—use only MODE_PRIVATE to be secure

33

Page 35: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

getSharedPreferences()

private String sharedPrefFile =

"com.example.android.hellosharedprefs";

mPreferences =

getSharedPreferences(sharedPrefFile,

MODE_PRIVATE);

34

Page 36: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Saving Shared Preferences

● SharedPreferences.Editor interface

● Takes care of all file operations

● put methods overwrite if key exists

● apply() saves asynchronously and safely

35

Page 37: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

SharedPreferences.Editor

@Override

protected void onPause() {

super.onPause();

SharedPreferences.Editor preferencesEditor =

mPreferences.edit();

preferencesEditor.putInt("count", mCount);

preferencesEditor.putInt("color", mCurrentColor);

preferencesEditor.apply();

}

36

Page 38: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Restoring Shared Preferences

● Restore in onCreate() in Activity

● Get methods take two arguments—the key, and the default value if the key cannot be found

● Use default argument so you do not have to test whether the preference exists in the file

37

Page 39: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Getting data in onCreate()mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);

mCount = mPreferences.getInt("count", 1);

mShowCount.setText(String.format("%s", mCount));

mCurrentColor = mPreferences.getInt("color", mCurrentColor);

mShowCount.setBackgroundColor(mCurrentColor);

mNewText = mPreferences.getString("text", "");

// ...

38

Page 40: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Clearing

● Call clear() on the SharedPreferences.Editor and apply changes

● You can combine calls to put and clear. However, when you apply(), clear() is always done first, regardless of order!

39

Page 41: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

clear()

SharedPreferences.Editor preferencesEditor =

mPreferences.edit();

preferencesEditor.clear();

preferencesEditor.apply();

40

Page 42: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Listening to Changes

41

Page 43: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Listening to changes● Implement interface

SharedPreference.OnSharedPreferenceChangeListener

● Register listener with registerOnSharedPreferenceChangeListener()

● Register and unregister listener in onResume() and onPause()

● Implement on onSharedPreferenceChanged() callback

42

Page 44: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Interface and callbackpublic class SettingsActivity extends AppCompatActivity

implements OnSharedPreferenceChangeListener { ...

public void onSharedPreferenceChanged(

SharedPreferences sharedPreferences, String key) {

if (key.equals(MY_KEY)) {

// Do something

}

}

}

43

Page 45: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

Creating and registering listener

SharedPreferences.OnSharedPreferenceChangeListener listener =

new SharedPreferences.OnSharedPreferenceChangeListener() {

public void onSharedPreferenceChanged(

SharedPreferences prefs, String key) {

// Implement listener here

}

};

prefs.registerOnSharedPreferenceChangeListener(listener);

44

Page 46: 5COSC005W MOBILE APPLICATION DEVELOPMENT Lecture 8: …

Shared PreferencesAndroid Developer Fundamentals V2

This work is licensed under a Creative Commons Attribution 4.0 International License.

You need a STRONG reference to the listener

● When registering the listener the preference manager does not store a strong reference to the listener

● You must store a strong reference to the listener, or it will be susceptible to garbage collection

● Keep a reference to the listener in the instance data of an object that will exist as long as you need the listener

45