Android course Database dr Milan Vidaković Chair of Informatics Faculty of Technical Sciences...
-
Upload
mercy-cole -
Category
Documents
-
view
218 -
download
3
Transcript of Android course Database dr Milan Vidaković Chair of Informatics Faculty of Technical Sciences...
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);