Blocco n.6

17/11/14 Data Storage Android Mobile Programming – Prof. R. De Prisco Slide 128 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Shared Preferences – daE privaE, coppie chiave-­‐valore •  Internal Storage – File privaE •  External Storage – File pubblici •  Database SQLite – DaE struOuraE in database privaE SharedPreferences Android Mobile Programming – Prof. R. De Prisco Slide 129 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Classe SharedPreferences –  permeOe di salvare e recuperare daE usando coppie di chiave-­‐valore •  2 metodi della classe AcEvity –  getSharedPreferences(“filename”) •  quando si vogliono usare più file di “preferenze” (daE) –  getPreferences() •  quando basta un solo file –  resEtuiscono un oggeOo SharedPreferences 1 17/11/14 SharedPreferences Android Mobile Programming – Prof. R. De Prisco Slide 130 Università di Salerno -­‐ a.a. 2013-­‐2014 •  SharedPreferences obj;
•  Scrivere i daE: serve un “editor” –  lo si o]ene con il metodo edit
–  SharedPreferences.Editor editor = obj.edit();
•  Con l’editor si possono può usare “put”: –  editor.putBoolean("KEY", bool_value);
–  editor.commit(); •  Leggere i daE: is usa “get” –  Boolean v = obj.getBoolean("KEY"); Internal Storage Android Mobile Programming – Prof. R. De Prisco Slide 131 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Per ogni app il sistema operaEvo prevede una directory privata –  solo l’app può accedere a questa directory –  se l’app viene disistallata, la directory viene cancellata •  Per creare e scrivere un file 1.  Chiamale openFileOutput(fileName, mode)
• 
resEtuisce un FileOutputStream 2.  Scrivere nel file (write()) 3.  Chiudere lo stream (close()) 2 17/11/14 Internal Storage Android Mobile Programming – Prof. R. De Prisco Slide 132 Università di Salerno -­‐ a.a. 2013-­‐2014 String FILENAME = "hello_file"; String string = "hello world!"; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); •  La modalità può essere –  MODE_PRIVATE –  MODE_APPEND –  MADE_WORLD_READABLE –  MADE_WORLD_WRITABLE Internal Storage Android Mobile Programming – Prof. R. De Prisco Slide 133 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Per leggere un file 1.  Chiamale openFileInput(fileName)
• 
resEtuisce un FileInputStream 2.  Leggere dal file (read()) 3.  Chiudere lo stream (close()) È possibile usare un file “staEco” meOendolo nella directory “res/raw” dell’applicazione. Lo si può leggere usando openRawResource passando come argomento l’idenEficatore R.raw.<filename>. Il metodo openRawResource resEtuisce un InputStream che può essere usato per leggere il file. 3 17/11/14 Internal Storage Android Mobile Programming – Prof. R. De Prisco Slide 134 Università di Salerno -­‐ a.a. 2013-­‐2014 •  getFilesDir()
–  ResEtusice la directory privata dell’app (dove vengono salvaE i file) •  getDir()
–  Crea (o apre se esiste) una directory all’interno dello spazio privato dell’app •  deleteFile()
–  cancella on file nello spazio privato •  filelist()
–  ResEtuisce un array di file, quelli presenE nello spazio privato File temporanei Android Mobile Programming – Prof. R. De Prisco Slide 135 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Per i file temporanei si può usare una directory cache –  Android cancellerà i file in questa directory SE necessario (quando manca spazio) •  getCacheDir() –  resEtuisce la directory cache –  è comunque responsabilità dell’app cancellare i file –  non si dovrebbe usare la directory cache per file grandi (grandezza massima raccomandata 1MB) 4 17/11/14 External Storage Android Mobile Programming – Prof. R. De Prisco Slide 136 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Android permeOe l’uElizzo di una memoria esterna –  Epicamente una SD card •  File nella memoria esterna sono pubblici (world-­‐
readable) •  Occorre richiedere il permesso di leOura/scriOura •  La memoria esterna può essere rimossa –  quindi non si può assumere che i file siano sempre disponibili External Storage Android Mobile Programming – Prof. R. De Prisco Slide 137 Università di Salerno -­‐ a.a. 2013-­‐2014 <manifest ...> <uses-­‐permission android:name="android.permission.WRITE_EXTERNAL_STORAGE” android:maxSdkVersion="18" /> … </manifest> •  Permesso Write include il permesso Read <manifest ...> <uses-­‐permission android:name="android.permission.READ_EXTERNAL_STORAGE” /> … </manifest> A parEre da Android 4.4, per lo spazio privato non c’è bisogno di permessi. 5 17/11/14 External Storage Android Mobile Programming – Prof. R. De Prisco Slide 138 Università di Salerno -­‐ a.a. 2013-­‐2014 /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; } Condividere file con altre app Android Mobile Programming – Prof. R. De Prisco Slide 139 Università di Salerno -­‐ a.a. 2013-­‐2014 •  getExternalStoragePublicDirectory(type) –  type: DIRECTORY_PICTURES, DIRECTORY_MUSIC , DIRECTORY_RINGTONES, … •  Esempio: metodo che crea una nuova dir per delle foto nella dir pubblica delle immagini public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; } 6 17/11/14 Database Android Mobile Programming – Prof. R. De Prisco Slide 140 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Android fornisce supporto per database SQL –  solo all’interno dell’app •  Per usare un database –  Creare una soOoclasse di SQLiteOpenHelper –  sovrascrivere il metodo onCreate() •  Quindi si crea un nuovo Helper: –  dbHelper = new DatabaseOpenHelper(this); •  Dal quale si ricava un database –  SQLiteDatabase db = dbHelper.getWritableDatabase(); Database Android Mobile Programming – Prof. R. De Prisco Slide 141 Università di Salerno -­‐ a.a. 2013-­‐2014 •  Sul database si possono applicare comandi standard SQL •  Tipicamente il database viene creato nel metodo onCreate() della soOoclasse DatabaseOpenHelper •  Nell’app vengono usaE: –  db.insert() –  db.delete() –  db.update() 7 17/11/14 Database Android Mobile Programming – Prof. R. De Prisco Slide 142 Università di Salerno -­‐ a.a. 2013-­‐2014 public class DicEonaryOpenHelper extends SQLiteOpenHelper { private staEc final int DATABASE_VERSION = 2; private staEc final String DICTIONARY_TABLE_NAME = "dicEonary"; private staEc final String DICTIONARY_TABLE_CREATE = "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + KEY_WORD + " TEXT, " + KEY_DEFINITION + " TEXT);”; DicEonaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } @Override public void onUpgarde(SQLiteDatabase db, int oldVersion, int newVersion) { // override necessario } } Data Storage Android Mobile Programming – Prof. R. De Prisco Slide 143 Università di Salerno -­‐ a.a. 2013-­‐2014 DataStorageIntFile
DataStorage
DataStoragePreferences
DataStorageSQL
8