android course database dr milan vidaković chair of informatics faculty of technical sciences...

24
Android course Database dr Milan Vidaković Chair of Informatics Faculty of Technical Sciences University of Novi Sad

Upload: mercy-cole

Post on 22-Dec-2015

218 views

Category:

Documents


3 download

TRANSCRIPT

Android course

Database

dr Milan VidakovićChair of Informatics

Faculty of Technical SciencesUniversity of Novi Sad

2/24

Database

• What is relational database model?• simplified answer: database consists of tables

• table is just like the one in the Excel

• Each table has rows and columns• Each column has: name, type (int,

string,...), undefined value or not (null), is it primary key or not (primary key), etc.

3/24

Primary key

• Primary key: a column(s) which identifies a row• Student index, vehicle registration plate

• Primary key can be autoincrement• Integer value which is incremented when a row is

inserted in a table

4/24

Android database

• Android comes with SQLite database • Features:

• self-contained,

• serverless,

• zero-configuration and

• transactional

• All the tables are placed in the /data folder (the only read-write folder on Android (except for the /sdcard folder content – SD card))

5/24

SQLite

• SQLiteDatabase class:

SQLiteDatabase db = dbHelper.getWritableDatabase();

SQLiteOpenHelper class: to open, close, create and modify database

DatabaseExamples

6/24

Helper class

• Extends SQLiteOpenHelper class

• Overrides:• onCreate(SQLiteDatabase)• onOpen(SQLiteDatabase)• onUpgrade(SQLiteDatabase, old_ver, new_ver)• onDowngrade(SQLiteDatabase, old_ver,

new_ver)

7/24

Helper classpublic class MyDbHelper extends SQLiteOpenHelper {

private static final String DATABASE_CREATE = "create table NOTES ( "

+ " _id integer primary key autoincrement, "

+ " naslov text not null, "

+ " vreme text not null, "

+ " tekst text not null);";

public MyDbHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase _db) {

_db.execSQL(DATABASE_CREATE);

}

@Override

public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) {

_db.execSQL("DROP TABLE IF EXISTS " + NotesDbManager.DATABASE_TABLE);

onCreate(_db);

}

}

8/24

SQLite database

• CRUD (Create, Read, Update, Delete):long insert(String table, String null_hack, ContentCalues entry)

Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

int update(String table, ContentValues values, String whereClause, String[] whereArgs)

int delete(String table, String whereClause, String[] whereArgs)

9/24

Insert

• Content to be inserted must be placed in the ContentValues map:

ContentValues newEntry = new ContentValues();

newEntry.put(“FirstName”, “Pera”);

newEntry.put(“LastName”, “Peric”);

long id = db.insert(DATABASE_TABLE, null, newEntry);

• Returns Id of the insterted row• Important when PK is autoincrement!

10/24

Query

• Return value is a cursor which is used to browse query results

• If criteria, group by, having, order by, and limit is omitted, lists the whole table:

Cursor c = db.query(DATABASE_TABLE, new String[] { _ID, TITLE, TIMESTAMP, TEXT }, null, null, null, null, null);

11/24

Query Query:

cursor = db.query(true, DATABASE_TABLE,

new String[] {_ID,TITLE,TIMESTAMP,TEXT},

_ID + "=?",

new String[] {id}, null, null, null, null);

• Raw query:

cursor = db.rawQuery("select _ID, TITLE, TIMESTAMP, TEXT from DATABASE_TABLE where ID=?", new String[] {id});

12/24

Cursor• To browse and read query results

• Browse:move(offset)

moveToFirst(), moveToLast(), moveToNext(), moveToPrevious()

isFirst(), isLast(), isAfterLast(), isBeforeFirst()

• Read:getCount()

getString(column_index)

getInt(column_index)

getColumnIndex(“LastName”);

13/24

Update• Updates column(s):ContentValues newValue = new ContentValues();newValue.put(“FirstName”, “MIKA”);newValue.put(“LastName”, “MIKIC”);int rows = db.update(DATABASE_TABLE, newValue,_ID + "=?", new String[] {id});

• SQL equivalent:

update DATABASE_TABLE set FirstName=“MIKA”, LastName=“MIKIC” where _ID=id

• If filter criteria is omitted, it will update all rows!

• Last two arguments are filter criteria and its parameters

• Returns the number of affected rows

14/24

Delete

• Deletes a row:

int rows = db.delete(DATABASE_TABLE,

_ID + "=?", new String[] {id});

• SQL equivalent:

delete from DATABASE_TABLE where _ID=id If filter criteria is omitted, it will update all rows! Last two arguments are filter criteria and its parameters Returns the number of affected rows

15/24

Data read

• To start reading query results:startManagingCursor(cur);

• This method binds cursor to Activity from which it has been created• If an activity is stopped, it will invoke cursor.deactivate()

• If an activity is restarted, it will invoke cursor.requery()

• If an activity is destroyed, it will close the cursor

• Each ListView has a ListAdapter which binds data and ListView

– SimpleCursorAdapter class is used to bind query results to a ListView

DatabaseExamples

16/24

SimpleCursorAdapter

• A kind of ListAdapter, which binds cursor to a ListView

• Procedure: execute query, create SimpleCursorAdapter, and put that adapter as a soruce to a ListView

17/24

SimpleCursorAdapter• Constructor:

ListAdapter adapter = new SimpleCursorAdapter(this,

R.layout.list_item,

cur,

new String[] { “FirstName”, “LastName”},

new int[] { R.id.firstname, R.id.lastname });

• Second argument (R.layout.list_item) is a resource ID which will visualise a row

• Third argument is a cursor

• Fourth argument is a list of column names in a db table

• Fifth argument is a list of component ids bound to appropriate columns in a table• Components are part of a row component (R.layout.list_item)

18/24

List multimedia files

• List multimeida files on a device

String[] proj = { MediaStore.Video.Media._ID,

MediaStore.Video.Media.DATA,

MediaStore.Video.Media.DISPLAY_NAME,

MediaStore.Video.Media.SIZE };

mediaCursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, proj, null, null, null);

DatabaseExamples

19/24

List multimedia files• How to bind query result and ListView?

Create custom Adapter, which extends BaseAdapterclass MMediaAdapter extends BaseAdapter {

private Context vContext;

public MMediaAdapter(Context c) {

vContext = c;

}

public int getCount() {

return mediaCursor.getCount();

}

public Object getItem(int position) {

return position;

}

public long getItemId(int position) {

return position;

}

20/24

List multimedia filespublic View getView(int position, View oldView, ViewGroup parent) {

System.gc();

TextView tv;

String id = null;

if (oldView == null) {

tv = new TextView(vContext.getApplicationContext());

int media_column_index = mediaCursor

.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);

mediaCursor.moveToPosition(position);

id = mediaCursor.getString(media_column_index);

media_column_index = mediaCursor

.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);

mediaCursor.moveToPosition(position);

id += " Size(KB):" + mediaCursor.getString(media_column_index);

tv.setText(id);

} else

tv = (TextView) oldView;

return tv;

}

}

21/24

Browse bookmarks and web history• Android browsers record all bookmarks and

history in a database

• Table has an alias: android.provider.Browser.BOOKMARKS_URI

• Columns:• Browser.BookmarkColumns.TITLE• Browser.BookmarkColumns.URL• Browser.BookmarkColumns.CREATED• Browser.BookmarkColumns.BOOKMARK – 1 for

a bookmark; 0 for historyDatabaseExamples

22/24

Browse bookmarks and web historyString[] columns = new String[] { Browser.BookmarkColumns.TITLE,

Browser.BookmarkColumns.URL, Browser.BookmarkColumns.CREATED };

Cursor cur = managedQuery(android.provider.Browser.BOOKMARKS_URI,

columns, null, null, null);

ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.bookmark_item,

cur,

new String[] { Browser.BookmarkColumns.TITLE,

Browser.BookmarkColumns.URL, Browser.BookmarkColumns.CREATED},

new int[] {

R.id.bookmark_title, R.id.bookmark_url, R.id.bookmark_created });

ListView mainList = (ListView) findViewById(R.id.bookmarks_list);

mainList.setAdapter(adapter);

23/24

Call history

• Android records all voice calls history in a database

• Table alias: CallLog.Calls.CONTENT_URI

• Columns:• Calls.NUMBER

• Calls.CACHED_NAME

• Calls.DURATION

• Calls.DATE

• Calls.TYPE (incoming, outgoing, missed)

DatabaseExamples

24/24

Call historyString[] columns = new String[] {Calls._ID , Calls.NUMBER,

Calls.CACHED_NAME, Calls.DURATION };

Cursor cur = managedQuery(CallLog.Calls.CONTENT_URI, columns, null,

null, null);

ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.call_history_item,

cur,

new String[] { Calls.NUMBER,

Calls.CACHED_NAME, Calls.DURATION},

new int[] {

R.id.call_number, R.id.call_name, R.id.call_duration });

ListView mainList = (ListView)findViewById(R.id.call_history_list);

mainList.setAdapter(adapter);