====== Chapter 11 ====== ===== Foreword ===== If you are not familiar with the term CRUD as applied to databases, it is an acronym for **C**reate (or Insert), **R**ead, **U**pdate, and **D**elete---the four main operations that are done on database records. It's often helpful to approach learning database stuff with these four primary operations in mind. It's also helpful to think in terms of database //schema//---the plan or layout of the database table(s). The book consistently uses "a" as the indefinite article ahead of "SQLite"---most probably because they assume a pronunciation of "sequel lite." The primary author of SQLite [[https://youtu.be/jN_YdMdjVpU?t=1m7s|sees things differently]], so the indefinite article should be "an". ===== p. 444: Code block ===== package com.hfad.starbuzz; import android.database.sqlite.SQLiteOpenHelper; import android.content.Context; import android.database.sqlite.SQLiteDatabase; class StarbuzzDatabaseHelper extends SQLiteOpenHelper { StarbuzzDatabaseHelper(Context context) { // This constructor isn't liked by the compiler. // It'll be fixed shortly. } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } The constructor in the above class definition will create compiler rage---which is fixed on the following page. But if you're impatient, the solution is to invoke to parent class' ctor: StarbuzzDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } ===== p. 447: Schema definition ===== You create the schema for your database in the ''SQLiteOpenHelper'''s ''onCreate'' method using plain old SQL on the SQLite database that's passed in. (If you've not seen SQL before, don't worry. It's the "standard" language used by databases for conducting transactions, and the basics are explained by example in the book.) @Override public void onCreate(SQLiteDatabase db) { /** * Create a DRINK table with an _id PK, * and fields for NAME, DESCRIPTION, and * IMAGE_RESOURCE_ID. */ db.execSQL("CREATE TABLE DRINK (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "DESCRIPTION TEXT, " + "IMAGE_RESOURCE_ID INTEGER);"); } ===== p. 448: Create ===== Use a ''ContentValues'' object to accumulate data for the new record and then use ''SQLiteDatabase'''s ''insert'' method to do the new record creation/insertion. Here it's being done in a private method: /** * Create a new drink record in the DRINK table. */ private static void insertDrink(SQLiteDatabase db, String name, String description, int resourceId) { ContentValues drinkValues = new ContentValues(); drinkValues.put("NAME", name); drinkValues.put("DESCRIPTION", description); drinkValues.put("IMAGE_RESOURCE_ID", resourceId); db.insert("DRINK", null, drinkValues); } ===== p. 449: Update ===== Update existing records in a table with ''SQLiteDatabase'''s ''update'' method: public int update (String table, ContentValues values, String whereClause, String[] whereArgs) ===== p. 450: Delete ===== Delete records in a table with ''SQLiteDatabase'''s ''delete'' method: public int delete(String table, String whereClause, String[] whereArgs) Calling ''delete()'' with null ''whereClause'' and ''whereArgs'' arguments will delete all the records in the database. ===== What about Read? ===== It's covered in Chapter 12. ===== p. 452: Code block ===== package com.hfad.starbuzz; import android.content.ContentValues; import android.database.sqlite.SQLiteOpenHelper; import android.content.Context; import android.database.sqlite.SQLiteDatabase; class StarbuzzDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "starbuzz"; // the name of the DB private static final int DB_VERSION = 1; // the version of the DB StarbuzzDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { /** * Create a DRINK table with an _id PK, * and fields for NAME, DESCRIPTION, and * IMAGE_RESOURCE_ID. */ db.execSQL("CREATE TABLE DRINK (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "DESCRIPTION TEXT, " + "IMAGE_RESOURCE_ID INTEGER);"); // Insert some drinks into the DRINKS table: insertDrink(db, "Latte", "Espresso and steamed milk", R.drawable.latte); insertDrink(db, "Cappuccino", "Espresso, hot milk and steamed-milk foam", R.drawable.cappuccino); insertDrink(db, "Filter", "Our best drip coffee", R.drawable.filter); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } private static void insertDrink(SQLiteDatabase db, String name, String description, int resourceId) { ContentValues drinkValues = new ContentValues(); drinkValues.put("NAME", name); drinkValues.put("DESCRIPTION", description); drinkValues.put("IMAGE_RESOURCE_ID", resourceId); db.insert("DRINK", null, drinkValues); } } ===== p. 467-468: Code block ===== package com.hfad.starbuzz; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; class StarbuzzDatabaseHelper extends SQLiteOpenHelper{ private static final String DB_NAME = "starbuzz"; // the name of our database private static final int DB_VERSION = 2; // the version of the database StarbuzzDatabaseHelper(Context context){ super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db){ updateMyDatabase(db, 0, DB_VERSION); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { updateMyDatabase(db, oldVersion, newVersion); } private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 1) { /** * Create a DRINK table with an _id PK, * and fields for NAME, DESCRIPTION, and * IMAGE_RESOURCE_ID. */ db.execSQL("CREATE TABLE DRINK (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "DESCRIPTION TEXT, " + "IMAGE_RESOURCE_ID INTEGER);"); // Insert drinks into the DRINKS table: insertDrink(db, "Latte", "Espresso and steamed milk", R.drawable.latte); insertDrink(db, "Cappuccino", "Espresso, hot milk and steamed-milk foam", R.drawable.cappuccino); insertDrink(db, "Filter", "Our best drip coffee", R.drawable.filter); } if (oldVersion < 2) { // Add a FAVORITE column. db.execSQL("ALTER TABLE DRINK ADD COLUMN FAVORITE NUMERIC;"); } } private static void insertDrink(SQLiteDatabase db, String name, String description, int resourceId) { ContentValues drinkValues = new ContentValues(); drinkValues.put("NAME", name); drinkValues.put("DESCRIPTION", description); drinkValues.put("IMAGE_RESOURCE_ID", resourceId); db.insert("DRINK", null, drinkValues); } }