Programmierung                                 von Apps                              Android Persistence                  ...
Die Studierenden                                 kennen die Möglichkeiten für                              Android Persist...
Danny Fürniß, 25.11.2012, 3                              Files
Internal Storage                              /data/data/<app-package-name>                                   /files      ...
openFileInput()                                              openFileOutput()                              MODE_PRIVATE – ...
External Storage                              Environment.getExternalStorageState();                              Context....
„In-APP“-Storage                              /res/raw       getResources().openRawResource()                            ...
Danny Fürniß, 25.11.2012, 8                              Shared Preferences
PreferenceActivity                              @Override                              public void onBuildHeaders(List<Hea...
extends PreferenceFragment                                addPreferencesFromResource(R.xml.prefs_server);                 ...
SharedPreferences                                            lesen und schreiben                               prefs = Pre...
Danny Fürniß, 25.11.2012, 12                               Database
SQLite                               • Keine Konfiguration notwendig                               • Kein Datenbank-Server...
SQLite DataTypes                               • TEXT                               • INTEGER                             ...
extend SQLiteOpenHelper                               • Erzeugt Datenbank                                  • onCreate()   ...
onCreate()                               public void onCreate(SQLiteDatabase db) {                                   db.ex...
onUpgrade()                               public void onUpgrade(SQLiteDatabase db,                                    int ...
Danny Fürniß, 25.11.2012, 18    E    E    T    A    R                          E                               A          ...
insert()                               ContentValues values = new ContentValues();                               values.pu...
query()                                      SQL                              Interface                               SELE...
update()                               db.update(                                    table,                               ...
delete()                               db.delete(                                     table,                              ...
Danny Fürniß, 25.11.2012, 23                               Cursor
Cursor nutzen                                 _id             edvNr             name                   …                  ...
Transactions                               int inserts = 0;                               try {                           ...
Danny Fürniß, 25.11.2012, 26                               Networking
Permissions                               android.permission.INTERNET                               android.permission.ACC...
10.0.2.2                               IP‐Adresse für das Host‐System im Android EmulatorDanny Fürniß, 25.11.2012, 28
Apache Http Client                               HttpClient client = new DefaultHttpClient();                             ...
java.net.HttpUrlConnection                               URL newsUrl = new URL(host + "/api/news.json");                  ...
Danny Fürniß, 25.11.2012, 31
Representational State                                              Transfer (REST)                                       ...
JSON                                      JSONObject                                                     JSONArray        ...
XML APIs                                 SAX (Simple API for XML)                               DOM (Document Object Model...
XmlPullParser                                                    XmlPullParserFactory.newPullParser().Danny Fürniß, 25.11....
XML                                        START_TAG, name = person                                                 START_...
Danny Fürniß, 25.11.2012, 37                               ContentProvider
Danny Fürniß, 25.11.2012, 38                               ContentProvider
URIs                                      Multi Item                               content://com.dfuerniss.pva.ss2012.data...
ContentResolver                               Cursor cursor =                                       getContentResolver().q...
android:authorities                               <provider                                 android:name=".provider.Lehrve...
Danny Fürniß, 25.11.2012, 42                                   extend                               ContentProvider   Demo
Danny Fürniß, 25.11.2012, 43                               Loader
Danny Fürniß, 25.11.2012, 44                               Loaders
initLoader                               private static final int NEWS_LOADER = 0;                               …        ...
implements                                        LoaderCallbacks<Cursor>                                                 ...
implements                                        LoaderCallbacks<Cursor>                                                 ...
AsyncTaskLoader                               @Override                               public Cursor loadInBackground() {  ...
CursorLoader                               CursorLoader cl =                                    new CursorLoader(context, ...
android:installLocation                                    internalOnly (default)                                         ...
Portions of this presentation                               are modifications based on                               work ...
Upcoming SlideShare
Loading in …5
×

Android Persistence and Networking

737 views

Published on

Unterlage zur Android Vorlesung "Programmierung von Apps" an der Hochschule Karlsruhe.
Die Studierenden kennen die Möglichkeiten für Android Persistence und Networking und verstehen, wie damit auf Daten und Netzwerke zugegriffen werden kann.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
737
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Android Persistence and Networking

  1. 1. Programmierung von Apps Android Persistence and NetworkingDanny Fürniß, 25.11.2012, 1
  2. 2. Die Studierenden kennen die Möglichkeiten für Android Persistence und Networking und verstehen, wie damit auf Daten und Netzwerke zugegriffen werden kann.Danny Fürniß, 25.11.2012, 2
  3. 3. Danny Fürniß, 25.11.2012, 3 Files
  4. 4. Internal Storage /data/data/<app-package-name> /files /shared_prefs /cache /databases /libDanny Fürniß, 25.11.2012, 4 … Demo
  5. 5. openFileInput() openFileOutput() MODE_PRIVATE – Kein Zugriff durch andere Apps MODE_WORLD_READABLE – Lesender Zugriff durch andere Apps MODE_WORLD_WRITABLE – Schreibender Zugriff durch andere Apps MODE_WORLD_READABLE | MODE_WORLD_WRITABLE – Lese- und Schreib-ZugriffDanny Fürniß, 25.11.2012, 5
  6. 6. External Storage Environment.getExternalStorageState(); Context.getExternalFilesDir(type); android.permission null .WRITE_EXTERNAL_STORAGE Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_PODCASTS, Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,Danny Fürniß, 25.11.2012, 6 Environment.DIRECTORY_PICTURES, Environment.DIRECTORY_MOVIES. /Android/data/<package-name> Demo Quelle: http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)
  7. 7. „In-APP“-Storage /res/raw  getResources().openRawResource() /res/xml  getResources().getXml() /assets  getAssets().open()Danny Fürniß, 25.11.2012, 7
  8. 8. Danny Fürniß, 25.11.2012, 8 Shared Preferences
  9. 9. PreferenceActivity @Override public void onBuildHeaders(List<Header> target) { super.onBuildHeaders(target); loadHeadersFromResource(R.xml.prefs_headers,  target); }Danny Fürniß, 25.11.2012, 9 Demo
  10. 10. extends PreferenceFragment addPreferencesFromResource(R.xml.prefs_server); prefs_server.xml <?xml version="1.0" encoding="utf‐8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/prefsServerSettings"> <EditTextPreference android:title="@string/prefsServerUrl"  android:key="prefsServerUrl"/> <CheckBoxPreference android:title="@string/prefsServerWifiOnly" Danny Fürniß, 25.11.2012, 10 android:key="prefsServerWifiOnly"/> </PreferenceCategory> </PreferenceScreen>
  11. 11. SharedPreferences lesen und schreiben prefs = PreferenceManager.getDefaultSharedPreferences(this); String prefsServerUrl =  prefs.getString("<key>", "<default‐value>"); SharedPreferences.Editor editor = prefs.edit(); editor.putString("<key>", "<value>");Danny Fürniß, 25.11.2012, 11 editor.commit();
  12. 12. Danny Fürniß, 25.11.2012, 12 Database
  13. 13. SQLite • Keine Konfiguration notwendig • Kein Datenbank-Server • Single-File Datenbank (Filesystem-Security) • Open Source • In Android integriert • Keine strikte statische Typisierung • sqlite.orgDanny Fürniß, 25.11.2012, 13
  14. 14. SQLite DataTypes • TEXT • INTEGER • REAL No checks! • Date and Time (functions) • TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").Danny Fürniß, 25.11.2012, 14 • INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. Quelle: http://www.sqlite.org/datatype3.html
  15. 15. extend SQLiteOpenHelper • Erzeugt Datenbank • onCreate() • Aktualisiert Datenbank • onUpgrade() • Ermöglicht Zugriff auf die Datenbank • getReadableDatabase() • getWritableDatabase()Danny Fürniß, 25.11.2012, 15 Demo
  16. 16. onCreate() public void onCreate(SQLiteDatabase db) { db.execSQL(NewsItemContract.Table.CREATE_TABLE_NEWS); db.execSQL("CREATE TABLE xyz (_id PRIMARY KEY AUTOIN…"); }Danny Fürniß, 25.11.2012, 16
  17. 17. onUpgrade() public void onUpgrade(SQLiteDatabase db,  int oldVersion, int newVersion) { db.execSQL("drop table if exists " +  NewsItemContract.Table.NEWS); onCreate(db); }Danny Fürniß, 25.11.2012, 17
  18. 18. Danny Fürniß, 25.11.2012, 18 E E T A R E A D E T A P D E E E L T
  19. 19. insert() ContentValues values = new ContentValues(); values.put(NewsItemColumns.title, item.getTitle()); values.put(NewsItemColumns.teaser, item.getTeaser()); values.put(NewsItemColumns.published, item.getPublished().getTime()); values.put(NewsItemColumns.pictureUrl, item.getPictureUri().toString()); values.put(NewsItemColumns.imageFileName, item.getImageFileName()); … db.insertOrThrow(NewsItemContract.Table.NEWS, null, values);Danny Fürniß, 25.11.2012, 19
  20. 20. query() SQL Interface SELECT edvNr, name projection/columns FROM lehrveranstaltung table WHERE name selection = "Prof. Dr.‐Ing. Vogelsang" selectionArgs groupBy = nullDanny Fürniß, 25.11.2012, 20 having = null ORDER BY edvNr orderBy
  21. 21. update() db.update( table, values, whereClause, whereArgs );Danny Fürniß, 25.11.2012, 21
  22. 22. delete() db.delete( table, whereClause, whereArgs );Danny Fürniß, 25.11.2012, 22
  23. 23. Danny Fürniß, 25.11.2012, 23 Cursor
  24. 24. Cursor nutzen _id edvNr name …         0                  1                 2                  3 int edvNrIndexDanny Fürniß, 25.11.2012, 24 = cursor.getColumnIndex(„edvNr“)    String edvNr =   cursor.getString(edvNrIndex)
  25. 25. Transactions int inserts = 0; try { db.beginTransaction(); if (null != table) { for (ContentValues contentValues : values) { db.insert(table, "", contentValues); inserts++; } db.setTransactionSuccessful(); } } catch (SQLException e) { Log.e(LOG_TAG, "Insert fehlgeschlagen", e);Danny Fürniß, 25.11.2012, 25 } finally { db.endTransaction(); } Bildquelle: http://developer.android.com/design/patterns/actionbar.html
  26. 26. Danny Fürniß, 25.11.2012, 26 Networking
  27. 27. Permissions android.permission.INTERNET android.permission.ACCESS_NETWORK_STATEDanny Fürniß, 25.11.2012, 27
  28. 28. 10.0.2.2 IP‐Adresse für das Host‐System im Android EmulatorDanny Fürniß, 25.11.2012, 28
  29. 29. Apache Http Client HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(host +   "/api/persons?type=ProfessorInnen"); // Response lesen HttpResponse response = client.execute(request); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String content = ""; StringBuilder responseTxt = new StringBuilder();  while ((content = reader.readLine()) != null) { responseTxt.append(content);Danny Fürniß, 25.11.2012, 29 } Demo
  30. 30. java.net.HttpUrlConnection URL newsUrl = new URL(host + "/api/news.json");  HttpURLConnection conn = (HttpURLConnection)  newsUrl.openConnection(); // Response lesen InputStream in = conn.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(in)); String content = ""; StringBuilder response = new StringBuilder(); while ((content = reader.readLine()) != null) { response.append(content);Danny Fürniß, 25.11.2012, 30 } Demo Quelle: http://android-developers.blogspot.de/2011/09/androids-http-clients.html
  31. 31. Danny Fürniß, 25.11.2012, 31
  32. 32. Representational State Transfer (REST) Architekturstil HTTP-Verben basierend auf WWW POST GET URI, Ressourcen, Repräsentationen http://localhost:8180/api/news PUT http://localhost:8180/api/news/3 http://localhost:8180/api/persons DELETEDanny Fürniß, 25.11.2012, 32 etc. json, xml, html, etc. http://www.slideshare.net/dnene/rest‐ representational‐state‐transfer‐explained
  33. 33. JSON JSONObject JSONArray JSONObject { "newsItem" : [ { "id" : 3, "imageFileName" : "news3.jpg", "pictureUri" : "http://localhost:8180/images/news3.jpg", "published" : "2011‐12‐20T13:07:54.480+01:00", "teaser" : "für Innovationen in der Hochschullehre", "title" : "Prof. Dr. Andreas Heberle erhält für gute Lehre Förderpreis von 50 000 Euro" } ] }Danny Fürniß, 25.11.2012, 33 Demo
  34. 34. XML APIs SAX (Simple API for XML) DOM (Document Object Model) StAX (Streaming API for XML)Danny Fürniß, 25.11.2012, 34 Quelle: http://www.torsten-horn.de/techdocs/java-xml.htm
  35. 35. XmlPullParser XmlPullParserFactory.newPullParser().Danny Fürniß, 25.11.2012, 35 Quelle: http://www.xmlpull.org; http://android-developers.blogspot.com/2011/12/watch-out-for-xmlpullparsernexttext.html
  36. 36. XML START_TAG, name = person START_TAG, name = akademischerTitel Text <person> <akademischerTitel>Prof. Dr.</akademischerTitel> <displayName>Albrecht, Ditzinger</displayName> <imageURI>http://localhost:8180/images/I_2e8f4d534f.jpg</imageURI> <personURI>http://localhost:8180/api/persons/3</personURI> </person>Danny Fürniß, 25.11.2012, 36 END_TAG, name = person Demo
  37. 37. Danny Fürniß, 25.11.2012, 37 ContentProvider
  38. 38. Danny Fürniß, 25.11.2012, 38 ContentProvider
  39. 39. URIs Multi Item content://com.dfuerniss.pva.ss2012.database.contentprovider/lehrveranstaltungen Single Item content://com.dfuerniss.pva.ss2012.database.contentprovider/lehrveranstaltungen/# Platzhalter für die Id der  LehrveranstaltungDanny Fürniß, 25.11.2012, 39 Demo
  40. 40. ContentResolver Cursor cursor =  getContentResolver().query( uri,  projection,  selection,  selectionArgs,  sortOrder );Danny Fürniß, 25.11.2012, 40
  41. 41. android:authorities <provider android:name=".provider.LehrveranstaltungContentProvider"  android:authorities= "com.dfuerniss.pva.ss2012.database.contentprovider"> </provider>Danny Fürniß, 25.11.2012, 41
  42. 42. Danny Fürniß, 25.11.2012, 42 extend ContentProvider Demo
  43. 43. Danny Fürniß, 25.11.2012, 43 Loader
  44. 44. Danny Fürniß, 25.11.2012, 44 Loaders
  45. 45. initLoader private static final int NEWS_LOADER = 0; … // setup news loader Log.i(TAG, "initLoader: " + NEWS_LOADER); newsLoader = getLoaderManager().initLoader(NEWS_LOADER,  null, this);Danny Fürniß, 25.11.2012, 45
  46. 46. implements LoaderCallbacks<Cursor> 1 @Override public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) { Log.i(TAG, "creating loader for id: " + loaderId); AsyncTaskLoader<Cursor> loader = null; if (loaderId == NEWS_LOADER) { Log.i(TAG, "creating news loader"); loader = new AsyncTaskLoader<Cursor>(this) { … }; } return loader;Danny Fürniß, 25.11.2012, 46 }
  47. 47. implements LoaderCallbacks<Cursor> 2 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { Log.i(TAG, "loader finished: " + loader.getId()); if (loader.getId() == NEWS_LOADER) { newsAdapter.swapCursor(cursor); } } @Override public void onLoaderReset(Loader<Cursor> loader) { Log.i(TAG, "loader reset: " + loader.getId());Danny Fürniß, 25.11.2012, 47 if (loader.getId() == NEWS_LOADER) { newsAdapter.swapCursor(null); } } Demo
  48. 48. AsyncTaskLoader @Override public Cursor loadInBackground() { Log.i(TAG, "load in background"); SQLiteDatabase db = ((Application) getApplication()) .getDbHelper().getReadableDatabase(); return db.query( NewsItemContract.Table.NEWS,  // Projection muss _id enthalten! NewsItemContract.Query.PROJECTION_ALL,  selection,  selectionArgs,  groupBy,  having, Danny Fürniß, 25.11.2012, 48 orderBy); } @Override public void onStartLoading() { …forceLoad()… }
  49. 49. CursorLoader CursorLoader cl =  new CursorLoader(context,  URI,  projection,  selection,  selectionArgs,  sortOrder );Danny Fürniß, 25.11.2012, 49
  50. 50. android:installLocation internalOnly (default) auto preferExternalDanny Fürniß, 25.11.2012, 50
  51. 51. Portions of this presentation are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.Danny Fürniß, 25.11.2012, 51

×