Android Persistence and Networking

51
Danny Fürniß, 25.11.2012, 1 Programmierung von Apps Android Persistence and Networking

description

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.

Transcript of Android Persistence and Networking

Page 1: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

1

Programmierungvon Apps

Android Persistenceand Networking

Page 2: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

2

Die Studierenden kennen die Möglichkeiten für

Android Persistence und Networkingund verstehen, wie damit auf Daten

und Netzwerke zugegriffen werden kann.

Page 3: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

3

Files

Page 4: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

4

Internal Storage

Demo

/data/data/<app-package-name>

/databases

/shared_prefs/files

/lib…

/cache

Page 5: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

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-Zugriff

Page 6: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

6

External Storage

Quelle: http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)

Environment.getExternalStorageState();

Context.getExternalFilesDir(type);

Environment.DIRECTORY_MUSIC,Environment.DIRECTORY_PODCASTS,Environment.DIRECTORY_RINGTONES,Environment.DIRECTORY_ALARMS,Environment.DIRECTORY_NOTIFICATIONS,Environment.DIRECTORY_PICTURES, Environment.DIRECTORY_MOVIES.

nullandroid.permission.WRITE_EXTERNAL_STORAGE

/Android/data/<package-name>Demo

Page 7: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

7

„In-APP“-Storage

/res/raw getResources().openRawResource()

/res/xml getResources().getXml()

/assets getAssets().open()

Page 8: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

8

Shared Preferences

Page 9: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

9

PreferenceActivity

@Overridepublic void onBuildHeaders(List<Header> target) {

super.onBuildHeaders(target);loadHeadersFromResource(R.xml.prefs_headers, 

target);}

Demo

Page 10: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

10

extends PreferenceFragmentaddPreferencesFromResource(R.xml.prefs_server);

<?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"/>

<CheckBoxPreferenceandroid:title="@string/prefsServerWifiOnly" android:key="prefsServerWifiOnly"/>

</PreferenceCategory></PreferenceScreen>

prefs_server.xml

Page 11: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

11

SharedPreferenceslesen und schreiben

prefs = PreferenceManager.getDefaultSharedPreferences(this);String prefsServerUrl = 

prefs.getString("<key>", "<default‐value>");

SharedPreferences.Editor editor = prefs.edit();editor.putString("<key>", "<value>");editor.commit();

Page 12: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

12

Database

Page 13: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

13

SQLite• Keine Konfiguration notwendig

• Kein Datenbank-Server

• Single-File Datenbank (Filesystem-Security)

• Open Source

• In Android integriert

• Keine strikte statische Typisierung

• sqlite.org

Page 14: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

14

SQLite DataTypes

Quelle: http://www.sqlite.org/datatype3.html

• TEXT

• INTEGER

• REAL

No checks!

• Date and Time (functions)

• TEXT as ISO8601 strings

("YYYY-MM-DD HH:MM:SS.SSS").

• INTEGER as Unix Time, the number of

seconds since 1970-01-01 00:00:00 UTC.

Page 15: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

15

extend SQLiteOpenHelper

• Erzeugt Datenbank

• onCreate()

• Aktualisiert Datenbank

• onUpgrade()

• Ermöglicht Zugriff auf die Datenbank

• getReadableDatabase()

• getWritableDatabase()

Demo

Page 16: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

16

onCreate()

public void onCreate(SQLiteDatabase db) {

db.execSQL(NewsItemContract.Table.CREATE_TABLE_NEWS);

db.execSQL("CREATE TABLE xyz (_id PRIMARY KEY AUTOIN…");}

Page 17: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

17

onUpgrade()

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("drop table if exists " + NewsItemContract.Table.NEWS);

onCreate(db);}

Page 18: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

18

REATE

EAD

PDATE

ELETE

Page 19: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

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

Page 20: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

20

query()

SELECT edvNr, name

FROM lehrveranstaltung

WHERE name

= "Prof. Dr.‐Ing. Vogelsang"

ORDER BY edvNr

SQL

projection/columns

table

selection

selectionArgs

groupBy = null

having = null

orderBy

Interface

Page 21: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

21

update()

db.update(table, values, whereClause,whereArgs

);

Page 22: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

22

delete()

db.delete(table, whereClause,whereArgs

);

Page 23: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

23

Cursor

Page 24: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

24

Cursor nutzen

int edvNrIndex= cursor.getColumnIndex(„edvNr“)   

String edvNr =  cursor.getString(edvNrIndex)

0                  1                 2                  3_id edvNr name …        

Page 25: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

25

Transactions

Bildquelle: http://developer.android.com/design/patterns/actionbar.html

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

} finally {db.endTransaction();

}

Page 26: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

26

Networking

Page 27: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

27

Permissions

android.permission.INTERNET

android.permission.ACCESS_NETWORK_STATE

Page 28: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

28

10.0.2.2IP‐Adresse für das Host‐System im Android Emulator

Page 29: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

29

Apache Http ClientHttpClient client = new DefaultHttpClient();HttpGet request = new HttpGet(host +  

"/api/persons?type=ProfessorInnen");

// Response lesenHttpResponse 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);}

Demo

Page 30: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

30

java.net.HttpUrlConnection

Quelle: http://android-developers.blogspot.de/2011/09/androids-http-clients.html

URL newsUrl = new URL(host + "/api/news.json"); HttpURLConnection conn = (HttpURLConnection) 

newsUrl.openConnection();

// Response lesenInputStream in = conn.getInputStream();BufferedReader reader = new BufferedReader(

new InputStreamReader(in));String content = "";StringBuilder response = new StringBuilder();while ((content = reader.readLine()) != null) {

response.append(content);}

Demo

Page 31: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

31

Page 32: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

32

Representational State Transfer (REST)

http://www.slideshare.net/dnene/rest‐representational‐state‐transfer‐explained

HTTP-Verben

POST

GET

PUT

DELETE

Architekturstil

basierend auf WWW

URI, Ressourcen, Repräsentationenhttp://localhost:8180/api/newshttp://localhost:8180/api/news/3http://localhost:8180/api/personsetc.

json, xml, html, etc.

Page 33: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

33

JSON

{ "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"} ] }

JSONObject

JSONArray

JSONObject

Demo

Page 34: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

34

XML APIs

Quelle: http://www.torsten-horn.de/techdocs/java-xml.htm

SAX (Simple API for XML)

DOM (Document Object Model)

StAX (Streaming API for XML)

Page 35: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

35

XmlPullParser

Quelle: http://www.xmlpull.org; http://android-developers.blogspot.com/2011/12/watch-out-for-xmlpullparsernexttext.html

XmlPullParserFactory.newPullParser().

Page 36: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

36

XML

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

START_TAG, name = person

START_TAG, name = akademischerTitel

Text

END_TAG, name = person

Demo

Page 37: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

37

ContentProvider

Page 38: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

38

ContentProvider

Page 39: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

39

URIs

content://com.dfuerniss.pva.ss2012.database.contentprovider/lehrveranstaltungen

content://com.dfuerniss.pva.ss2012.database.contentprovider/lehrveranstaltungen/#

Multi Item

Single Item

Platzhalter für die Id der Lehrveranstaltung

Demo

Page 40: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

40

ContentResolver

Cursor cursor = getContentResolver().query(

uri, projection, selection, selectionArgs, sortOrder

);

Page 41: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

41

android:authorities

<providerandroid:name=".provider.LehrveranstaltungContentProvider" android:authorities=

"com.dfuerniss.pva.ss2012.database.contentprovider"></provider>

Page 42: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

42

extendContentProvider

Demo

Page 43: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

43

Loader

Page 44: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

44

Loaders

Page 45: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

45

initLoader

private static final int NEWS_LOADER = 0;

// setup news loaderLog.i(TAG, "initLoader: " + NEWS_LOADER);newsLoader = getLoaderManager().initLoader(NEWS_LOADER, 

null, this);

Page 46: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

46

implementsLoaderCallbacks<Cursor>

1@Overridepublic 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;

}

Page 47: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

47

implementsLoaderCallbacks<Cursor>

2@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

Log.i(TAG, "loader finished: " + loader.getId());if (loader.getId() == NEWS_LOADER) {

newsAdapter.swapCursor(cursor);}

}

@Overridepublic void onLoaderReset(Loader<Cursor> loader) {

Log.i(TAG, "loader reset: " + loader.getId());if (loader.getId() == NEWS_LOADER) {

newsAdapter.swapCursor(null);}

}Demo

Page 48: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

48

AsyncTaskLoader@Overridepublic 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, orderBy);

}

@Overridepublic void onStartLoading() { …forceLoad()… }

Page 49: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

49

CursorLoaderCursorLoader cl = 

new CursorLoader(context, URI, projection, selection, selectionArgs, sortOrder

);

Page 50: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

50

android:installLocation

internalOnly (default)

auto

preferExternal

Page 51: Android Persistence and Networking

Dann

y Für

niß,

25.

11.2

012,

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.