570 likes | 1.2k Views
SQLite Database. SQLite. Public domain database Advantages Small (about 150 KB) Used on devices with limited resources Each database contained within one file Can be seen in file explorer /data/data/ packagename /database/ Self-contained no special administration needed. SQLite.
E N D
SQLite • Public domain database • Advantages • Small (about 150 KB) • Used on devices with limited resources • Each database contained within one file • Can be seen in file explorer /data/data/packagename/database/ • Self-contained • no special administration needed
SQLite • Primary components • SQLiteOpenHelper • android.database.sqlite.SQLiteOpenHelper • manages aspects of the database • creating or opening database • SQLiteDatabase • android.database.sqlite.SQLiteDatabase • methods to interface with database via SQL • Cursor • android.database.Cursor • provides access to result set returned by a query
Typical Approaches • Approach 1: Providing a database with the app • store .db file in Assets folder • .db file created within Android • .db file created in other SQLite manager, such as Firefox plug-in • in onCreate() of extended Activity, copy the database if it does not already exist in the device’s internal memory • onCreate() method in extended SQLiteOpenHelper class typically empty • Approach 2: Database created when app first run • onCreate() method in extended SQLiteOpenHelper class contains SQL to create database • will only run if the database does not exist
SQLiteOpenHelper • Abstract class • Subclass in a new .java file • Useful methods • onCreate (abstract) • called when DB first created – table creation done here • onUpgrade (abstract) • called when DB is changed (i.e. during new app release) • essentially used to drop and recreate database • getReadableDatabase • called to get a read-only version of database • getWriteableDatabase • called to get an editable version of database
Sample code - SQLiteOpenHelper public class MyClass extends SQLiteOpenHelper { public MyClass (Context ctx) { //Parameters: Context, file name, CursorFactory factory, database version) //CursorFactory rarely used – only used for customized Cursors super (ctx, "myfilename.db", null, 1); } public void onUpgrade (SQLiteDatabase db, intoldVer, intnewVer) { db.execSQL("DROP TABLE IF EXISTS TABLE_NAME"); onCreate(db); } public void onCreate(SQLiteDatabase db) { //_id field must be included!!! db.execSQL("CREATE TABLE MYTABLE (_id INTEGER PRIMARY KEY AUTOINCREMENT, ..."); } }
SQLiteDatabase • Concrete class • SQL methods • Convenience methods • query – returns a Cursor • insert – returns _id of new record or –1 if error occurred • update – returns number of rows affected • delete – number of rows affected (0 if no where clause) • pass ‘1’ as where clause to get count in this case • Manual creation of SQL • rawQuery • can execute any SELECT statement and returns a Cursor • execSQL • can execute any SQL statement that is not a SELECT • void return type
SQLiteDatabase • query method • Parameters • String – table name • String [] – columns to select • _id field must be included if displaying in List • String – where clause (without the word WHERE) • null if not wanted • ? for arguments • String [] – selection clause, to allow arguments for field names in where clause • only if ? in preceding string • String – group by clause (without the words GROUP BY) • String – having clause (without the word HAVING) • String – order by clause (without the words ORDER BY)
Sample code – query String [] FROM = {List of desired columns to select}; SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getReadableDatabase(); Cursor myCursor = db.query(MY_TABLE_NAME, FROM, null, null, null, null, null);
SQLiteDatabase • insert method • Parameters • String – table name • String – work around to allow insertion of empty row in SQL • nullColumnHack • SQLLite does not allow: • INSERT INTO MYTABLE • ContentValues will be null • ContentValues – Object holding the corresponding field names and values
Sample code – insert SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, column value); values.put(COLUMN_NAME, column value); ... values.put(COLUMN_NAME, column value); db.insert(MY_TABLE_NAME, null, values);
SQLiteDatabase • update method • Parameters • String – table name • ContentValues – Object holding the corresponding field names and values • String – where clause (without the word WHERE) • String [] – selection clause, to allow arguments for field names in where clause
Sample code – update SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getWritableDatabase(); String where = "My WHERE clause (without the word WHERE)"; ContentValues values = new ContentValues(); values.put(COLUMN_NAME, column value); values.put(COLUMN_NAME, column value); ... values.put(COLUMN_NAME, column value); db.update(MY_TABLE_NAME, values, where, null);
SQLiteDatabase • delete method • Parameters • String – table name • String – where clause (without the word WHERE) • String [] – selection clause, to allow arguments for field names in where clause
Sample code – delete SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getWritableDatabase(); String where = "My WHERE clause (without the word WHERE)"; db.delete(MY_TABLE_NAME, where, null);
SQLiteDatabase • rawQuery method • Parameters • String – SQL statement • String [] – selection clause, to allow arguments for field names in where clause
Sample code – rawQuery SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getWritableDatabase(); Cursor myCursor = db.rawQuery(“SQL statement here”, null);
SQLiteDatabase • execSQL method • Parameters • String – SQL statement
Sample code – execSQL SQLiteDatabase db = myInstanceOfSQLiteOpenHelper.getWritableDatabase(); db.execSQL(“SQL statement here”);
Aspects of Cursor class • SQLiteDatabase query method returns a Cursor • Cursor must be managed by Activity • Cursor class allows manipulation of pointer • move, moveToFirst, moveToNext, moveToPosition, etc. • Cursor class allows retrieval of data • getInt, getDouble, getString, etc. • must provide column position • Cursor can be associated with an Adapter • typically SimpleCursorAdapter
Sample code – Cursor data retrieval • Retrieving the integer in the 4th row, 3rd column myCursor.moveToPosition(3); int x = myCursor.getInt(2);
Sample code – populating a Cursor from a Database private Cursor populateCursor() { String [] FROM = {List of desired DB field names}; SQLiteDatabase db = myInstanceOfSQLiteHelper.getReadableDatabase(); Cursor myCursor = db.query(MY_TABLE_NAME, FROM, null, null, null, null, null); return myCursor; }
Sample code – displaying Cursor contents in a ListView private void displayRecords(Cursor c) { String [] from = {List of desired field names to display}; int [] to = new int [] {List of TextViews to display field names (i.e. R.id.myTextView)}; ListViewlv = (ListView)findViewById(R.id.myListView); SimpleCursorAdapter records = new SimpleCursorAdapter(this, R.layout.my_file_for_TextViews, c, from, to); lv.setAdapter(records); }