import UIKit
var x: Int = 42
var x = 42
let y = 100
var myString = "Hello"
// Control Flow
if x < 50 {
print("X is less than 50")
} else {
print("X is greater than or equal to 50")
}
// Classes
class ViewController: UIViewController {
// Instance Variables go here
// Class functions go here
}
// Functions
func printHello(){
print("Hello")
}
printHello()
func printHelloMessage(helloString: String){
print(helloString)
}
printHelloMessage("Oi!")
Create the Empty View
<red lines> <!-- Empty view for the list --> <RelativeLayout android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"> <ImageView android:id="@+id/empty_shelter_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/ic_empty_shelter" /> <TextView android:id="@+id/empty_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_shelter_image" android:layout_centerHorizontal="true" android:fontFamily="sans-serif-medium" android:paddingTop="16dp" android:text="@string/empty_view_title_text" android:textAppearance="?android:textAppearanceMedium" /> <TextView android:id="@+id/empty_subtitle_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/empty_title_text" android:layout_centerHorizontal="true" android:fontFamily="sans-serif" android:paddingTop="8dp" android:text="@string/empty_view_subtitle_text" android:textAppearance="?android:textAppearanceSmall" android:textColor="#A2AAB0"> </RelativeLayout>
Using a CursorLoader
Activity -> LoaderCallbacks
CursorAdapter
ArrayAdapter
Data source: ArrayList of words
Data source: Cursor of pets
public class PetCursorAdapter extends CursorAdapter {
public PetCursorAdapter(Context context, Cursor c){
super(context, c, 0);
}
public view newView(Context context, Cursor c, ViewGroup parent){
// create and return new blank list item
}
public void bindView(View view, Context context, Cursor c){
// Populate list item view with pet data
}
}
ContentProvider Update()
public class PetProvider extends ContentProvider {
...
@Override
public int update(Uri uri, ContentValues contentValues, String selection,
String[] selectionArgs){
final int match = sUriMatcher.match(uri);
switch (match){
case PETS:
return updatePet(uri, contentValues, selection, selectionArgs);
case PET_ID:
selection = PetEntry._ID + "=?";
selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri))};
return updatePet(uri, contentValues, selection, selectionArgs);
default:
throw new IllegalArgumentException("Update is not supported for " + uri);
}
}
}
Implement ContentProvider
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder){
SQLiteDatabase database = mDbHelper.getReadableDatabase();
Cursor cursor;
int match = sUriMatcher.match(uri);
switch(match){
case PETS:
//
break;
case PET_ID:
selection = PetEntry._ID + "=?";
selectionArgs = new String[] { String.valueOf(ContentUris.parseId(uri))};
cursor = database.query(PetEntry.TABLE_NAME, projection, selection, selectionArgs,
null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Cannot query unknown URI " + uri);
}
return cursor;
}
public class PetProvider extends ContentProvider {
@Override
public Uri insert(Uri uri, ContentValues contentValues){
final int match = sUriMatcher.match(uri);
switch (match){
case PETS:
return insertPet(uri, contentValues);
default:
throw new IllegalArgumentException("Insertion is not supported for " + uri);
}
}
private Uri insertPet(Uri uri, ContentValues values){
return ContentUris.withAppendedId(uri, id):
}
}
private Uri insertPet(Uri uri, ContentValues values){
String name = values.getAsString(PetEntry.COLUMN_PET_NAME);
if (name == null){
throw new IllegalArgumentException("Pet requires a name");
}
SQLiteDatabase database = mDbHelper.getWritableDatabse();
long id = database.insert(PetEntry.TABLE_NAME, null, values);
if (id == -1){
Log.e(LOG_TAG, "Failed to insert row for " + uri);
return null;
}
return ContentUris.withAppendedId(uri, id);
}
Content Provider
UI Code is directory interacting with database
CatalogActivity ->
EditorActivity -> Content Provider -> PetDbHelper (Pet with ID 1 has weight 7)
Manage access to a structured set of data
-good abstraction layer between data source & UI code (can add data validation, can modify how data is stored UI code is unaffeted)
-work well with other Android framework classes
UI code
Catalog Activity, Content Resolver, Pet Provider, PetDbHelper SQLiteDatabase
Contacts provider
content://com.android.contacts/contacts
Calendar provider
content://com.android.calendar/events
User Dictionary provider
content://user_dictionary/words
Scheme, Content Authority, Type of data
content authority
<provider android:name=".data.PetProvider" android:authorities="com.example.android.pets" android:exported="false" />
int match = sUriMatcher.match(uri);
if (match == CONTACTS){
// Act on the contacts table
} else if (match == CONTACTS_ID){
// Act on a single contact in contacts table
}
public class PetProvider extends ContentProvider {
private static final int PETS = 100;
private static final int PET_ID = 101;
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sUriMatcher.addURI(PetContract.CONTENT_AUTHORITY, PetContract.PATH_PETS,PETS);
sUriMatcher.addURI(PetContract.CONTENT_AUTHORITY,PetContract.PATH_PETS + ""/, PETS_ID);
}
...
}
Read values from Cursor
Read
Cursor c = db.query(PetEntry.TABLE_NAME,projection, selection, selectionArgs, null, null, null);
while (cursor.moveToNext()){
int currentID = cursor.getInt(idColumnIndex);
String currentName = cursor.getString(nameColumnIndex);
displayView.append(("\n" + currentId + " - " +
currentName));
}
Insert Dummy pet from menu item
1. Get pet attributes from user input fields
2. Insert new pet with those attributes into the database
SELECT name, breed FROM pets;
SELECT * FROM pets;
SELECT * FROM pets WHERE _id = 1;
String selection = PetEntry._ID = "=?";
String[] selectionArgs = {"1"};
In Java;
String[] projection = { PetEntry.COLUMN_PET_BREED,
PetEntry.COLUMN_PET_WEIGHT };
String selection = PetEntry.COLUMN_PET_GENDER + "=?";
String selectionArgs = new String[] { PetEntry.GENDER_FEMALE };
Cursor c = db.query(PetEntry.TABLE_NAME, projection,
selection, selectionArgs,
null, null, null);
SELECT breed, weight FROM pets WHERE gender = 1
Handling a cursor object
-moveToFirst: moves the cursor to the first row that’s in the result set
-moveToLast: moves the cursor to the last row that’s in the result set
-moveToPosition(int position): moves the cursor to a specific position; for example, saying “moveToPosition(3)” would move it to the fourth row.
abstract float, abstract int, abstract long, abstract short, abstract String, abstract int
cusor.moveToPosition(3); int nameColumnIndex = cusor.getColumnIndex(PetEntry.COLUMN_PET_NAME); String name = cursor.getString(nameColumnIndex);
cusor.moveToFirst(); cusor.moveToNext(); cusor.moveToNext(); int nameColumnIndex = cusor.getColumnIndex(PetEntry.COLUMN_PET_NAME); int weightColumnIndex = cursor.getColumnIndex(PetEntry.COLUMN_PET_WEIGHT); int result = cursor.getInt(weightColumnIndex);
Getting a database connection
UI -> I want a readable database
EditorActivity, CatalogActivity
SQLiteDatabase db = mDbHelper.getReadableDatabase();
PetContract
PetDbHelper
PetDbHelper mDbHelper = new PetDbHelper(this);
Is there a database? no -> Make a database using onCreate() code
SQLiteDatabase
Create Update Delete
->SQLiteDatabase db = mDbHelper.getWritableDatabase();
Select
->SQLiteDatabase db = mDbHelper.getWritableDatabase();
INSERT INTO <table name>( <column_name_1>, <column_name_2>, ...) VALUES ( <values_1>, <values_2> ...) INSERT INTO pets ( _id, name, breed, weight) VALUES ( 1, "Tommy", 1, 4);
Inserting Data: Content Values
Key – Value, COLUMN_PET_NAME – “Garfield”, COLUMN_PET_BREED – “Tabby”, COLUMN PET GENDER – GENDER_MALE, COLUMN_PET_WEIGHT – 14
ContentValues values = new ContentValues(); values.put(PetEntry.COLUMN_PET_NAME, "Garfield"); values.put(PetEntry.COLUMN_PET_BREED, "Tabby"); values.put(PetEntry.COLUMN_PET_GENDER, PetEntry.GENDER_MALE); values.put(PetEntry.COLUMN_PET_WEIGHT, 14);
SQLiteOpenHelper
-Create a class that extends from SQLiteOpenHelper
-Create constants for database name and database version
-Create a constructor
-Implement the onCreate() method – this method is for when the database is first created
-Implement onUpgrade() – this method is for when the database schema of the database changes
(ex:adding a different column)
public class FeedReaderDbHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public FeedReaderDbHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db){
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
db.execSQL(SQL_DELETE_ENTRIES);
onCreate db;
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion){
onUpgrade db oldVersion, newVersion;
}
}