Esempio n. 1
0
  /*
     This test uses the database directly to insert and then uses the ContentProvider to
     read out the data.  Uncomment this test to see if your location queries are
     performing correctly.
  */
  public void testBasicLocationQueries() {
    // insert our test records into the database
    WeatherDatabaseHelper dbHelper = new WeatherDatabaseHelper(mContext);
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();
    long locationRowId = TestUtilities.insertNorthPoleLocationValues(mContext);

    // Test the basic content provider query
    Cursor locationCursor =
        mContext.getContentResolver().query(LocationEntry.CONTENT_URI, null, null, null, null);

    // Make sure we get the correct cursor out of the database
    TestUtilities.validateCursor(
        "testBasicLocationQueries, location query", locationCursor, testValues);

    // Has the NotificationUri been set correctly? --- we can only test this easily against API
    // level 19 or greater because getNotificationUri was added in API level 19.
    if (Build.VERSION.SDK_INT >= 19) {
      assertEquals(
          "Error: Location Query did not properly set NotificationUri",
          locationCursor.getNotificationUri(),
          LocationEntry.CONTENT_URI);
    }
  }
Esempio n. 2
0
  /*
      Students:  Here is where you will build code to test that we can insert and query the
      location database.  We've done a lot of work for you.  You'll want to look in TestUtilities
      where you can uncomment out the "createNorthPoleLocationValues" function.  You can
      also make use of the ValidateCurrentRecord function from within TestUtilities.
  */
  public void testLocationTable() {
    // First step: Get reference to writable database
    SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();

    // Create ContentValues of what you want to insert
    // (you can use the createNorthPoleLocationValues if you wish)
    ContentValues values = TestUtilities.createNorthPoleLocationValues();

    // Insert ContentValues into database and get a row ID back
    long row = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, values);
    assertTrue(row != -1);

    // Query the database and receive a Cursor back
    Cursor cursor =
        db.query(WeatherContract.LocationEntry.TABLE_NAME, null, null, null, null, null, null);

    // Move the cursor to a valid database row
    cursor.moveToFirst();

    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    TestUtilities.validateCurrentRecord("Error: Location Query validation", cursor, values);

    // Finally, close the cursor and database
    cursor.close();
    db.close();
  }
Esempio n. 3
0
  /*
      Students:  Here is where you will build code to test that we can insert and query the
      location database.  We've done a lot of work for you.  You'll want to look in TestUtilities
      where you can uncomment out the "createNorthPoleLocationValues" function.  You can
      also make use of the ValidateCurrentRecord function from within TestUtilities.
  */
  public long testLocationTable() {
    // First step: Get reference to writable database
    SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();
    // Create ContentValues of what you want to insert
    // (you can use the createNorthPoleLocationValues if you wish)
    TestUtilities tu = new TestUtilities();
    ContentValues cv = tu.createNorthPoleLocationValues();
    // Insert ContentValues into database and get a row ID back
    long id = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, cv);
    assertFalse("Insert failed. ", id == -1);
    // Query the database and receive a Cursor back
    Cursor c = db.rawQuery("SELECT * FROM " + WeatherContract.LocationEntry.TABLE_NAME, null);
    // Move the cursor to a valid database row
    c.moveToFirst();
    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    tu.validateCurrentRecord("Nije isti location record", c, cv);

    // Finally, close the cursor and database
    c.close();
    db.close();

    return id;
  }
Esempio n. 4
0
  public long insertLocation() {
    // First step: Get reference to writable database
    SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();

    // Create ContentValues of what you want to insert
    ContentValues weatherValues = TestUtilities.createNorthPoleLocationValues();

    // Insert ContentValues into database and get a row ID back
    long rowID = TestUtilities.insertNorthPoleLocationValues(this.mContext);
    assertFalse("Insert failed", rowID == -1);

    // Query the database and receive a Cursor back
    Cursor c =
        db.query(WeatherContract.LocationEntry.TABLE_NAME, null, null, null, null, null, null);

    // Move the cursor to a valid database row
    assertTrue("No records freturned from location query", c.moveToFirst());

    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    TestUtilities.validateCurrentRecord(
        "Location data read from DB did not match ContentValues", c, weatherValues);

    assertFalse("More than one record returned", c.moveToNext());

    // Finally, close the cursor and database
    c.close();
    db.close();
    return rowID;
  }
Esempio n. 5
0
  /*
     This test uses the provider to insert and then update the data. Uncomment this test to
     see if your update location is functioning correctly.
  */
  public void testUpdateLocation() {
    // Create a new map of values, where column names are the keys
    ContentValues values = TestUtilities.createNorthPoleLocationValues();

    Uri locationUri = mContext.getContentResolver().insert(LocationEntry.CONTENT_URI, values);
    long locationRowId = ContentUris.parseId(locationUri);

    // Verify we got a row back.
    assertTrue(locationRowId != -1);
    Log.d(LOG_TAG, "New row id: " + locationRowId);

    ContentValues updatedValues = new ContentValues(values);
    updatedValues.put(LocationEntry._ID, locationRowId);
    updatedValues.put(LocationEntry.CITY_NAME, "Santa's Village");

    // Create a cursor with observer to make sure that the content provider is notifying
    // the observers as expected
    Cursor locationCursor =
        mContext.getContentResolver().query(LocationEntry.CONTENT_URI, null, null, null, null);

    TestUtilities.TestContentObserver tco = TestUtilities.getTestContentObserver();
    locationCursor.registerContentObserver(tco);

    int count =
        mContext
            .getContentResolver()
            .update(
                LocationEntry.CONTENT_URI,
                updatedValues,
                LocationEntry._ID + "= ?",
                new String[] {Long.toString(locationRowId)});
    assertEquals(count, 1);

    // Test to make sure our observer is called.  If not, we throw an assertion.
    //
    // Students: If your code is failing here, it means that your content provider
    // isn't calling getContext().getContentResolver().notifyChange(uri, null);
    tco.waitForNotificationOrFail();

    locationCursor.unregisterContentObserver(tco);
    // locationCursor.close();

    // A cursor is your primary interface to the query results.
    Cursor cursor =
        mContext
            .getContentResolver()
            .query(
                LocationEntry.CONTENT_URI,
                null, // projection
                LocationEntry._ID + " = " + locationRowId,
                null, // Values for the "where" clause
                null // sort order
                );

    TestUtilities.validateCursor(
        "testUpdateLocation.  Error validating location entry update.", cursor, updatedValues);

    // cursor.close();
  }
Esempio n. 6
0
  /*
     Students: This is a helper method for the testWeatherTable quiz. You can move your
     code from testLocationTable to here so that you can call this code from both
     testWeatherTable and testLocationTable.
  */
  public long insertLocation() {
    // First step: Get reference to writable database
    // If there's an error in those massive SQL table creation Strings,
    // errors will be thrown here when you try to get a writable database.
    WeatherDbHelper dbHelper = new WeatherDbHelper(mContext);
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    // Second Step: Create ContentValues of what you want to insert
    // (you can use the createNorthPoleLocationValues if you wish)
    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();

    // Third Step: Insert ContentValues into database and get a row ID back
    long locationRowId = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, testValues);

    // Verify we got a row back.
    assertTrue(locationRowId != -1);

    // Data's inserted.  IN THEORY.  Now pull some out to stare at it and verify it made
    // the round trip.

    // Fourth Step: Query the database and receive a Cursor back
    // A cursor is your primary interface to the query results.
    Cursor cursor =
        db.query(
            WeatherContract.LocationEntry.TABLE_NAME, // Table to Query
            null, // all columns
            null, // Columns for the "where" clause
            null, // Values for the "where" clause
            null, // columns to group by
            null, // columns to filter by row groups
            null // sort order
            );

    // Move the cursor to a valid database row and check to see if we got any records back
    // from the query
    assertTrue("Error: No Records returned from location query", cursor.moveToFirst());

    // Fifth Step: Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    TestUtilities.validateCurrentRecord(
        "Error: Location Query Validation Failed", cursor, testValues);

    // Move the cursor to demonstrate that there is only one record in the database
    assertFalse("Error: More than one record returned from location query", cursor.moveToNext());

    // Sixth Step: Close Cursor and Database
    cursor.close();
    db.close();

    return locationRowId; // if error getting a row back: -1L
  }
Esempio n. 7
0
 public long insertLocation() {
   SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();
   // Create ContentValues of what you want to insert
   // (you can use the createNorthPoleLocationValues if you wish)
   TestUtilities tu = new TestUtilities();
   ContentValues cv = tu.createNorthPoleLocationValues();
   // Insert ContentValues into database and get a row ID back
   long id = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, cv);
   assertFalse("Insert failed. ", id == -1);
   // Query the database and receive a Cursor back
   db.close();
   return id;
 }
Esempio n. 8
0
  /*
     Students:  Here is where you will build code to test that we can insert and query the
     database.  We've done a lot of work for you.  You'll want to look in TestUtilities
     where you can use the "createWeatherValues" function.  You can
     also make use of the validateCurrentRecord function from within TestUtilities.
  */
  public void testWeatherTable() {
    // First insert the location, and then use the locationRowId to insert
    // the weather. Make sure to cover as many failure cases as you can.

    SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();

    // Create ContentValues of what you want to insert
    // (you can use the createNorthPoleLocationValues if you wish)
    ContentValues values = TestUtilities.createNorthPoleLocationValues();

    long row = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, values);
    // Instead of rewriting all of the code we've already written in testLocationTable
    // we can move this code to insertLocation and then call insertLocation from both
    // tests. Why move it? We need the code to return the ID of the inserted location
    // and our testLocationTable can only return void because it's a test.

    // First step: Get reference to writable database

    // Create ContentValues of what you want to insert
    // (you can use the createWeatherValues TestUtilities function if you wish)
    ContentValues weatherValue = TestUtilities.createWeatherValues(row);

    // Insert ContentValues into database and get a row ID back
    long weatherRow = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, weatherValue);
    assertTrue(weatherRow != -1);

    // Query the database and receive a Cursor back
    Cursor cursor =
        db.query(WeatherContract.WeatherEntry.TABLE_NAME, null, null, null, null, null, null);

    // Move the cursor to a valid database row
    cursor.moveToFirst();

    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    TestUtilities.validateCurrentRecord("Error: Location Query validation", cursor, weatherValue);

    // Finally, close the cursor and database
    cursor.close();
    db.close();
  }
Esempio n. 9
0
  /*
     This test uses the database directly to insert and then uses the ContentProvider to
     read out the data.  Uncomment this test to see if the basic weather query functionality
     given in the ContentProvider is working correctly.
  */
  public void testBasicWeatherQuery() {
    // insert our test records into the database
    WeatherDbHelper dbHelper = new WeatherDbHelper(mContext);
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();
    long locationRowId = TestUtilities.insertNorthPoleLocationValues(mContext);

    // Fantastic.  Now that we have a location, add some weather!
    ContentValues weatherValues = TestUtilities.createWeatherValues(locationRowId);

    long weatherRowId = db.insert(WeatherEntry.TABLE_NAME, null, weatherValues);
    assertTrue("Unable to Insert WeatherEntry into the Database", weatherRowId != -1);

    db.close();

    // Test the basic content provider query
    Cursor weatherCursor =
        mContext.getContentResolver().query(WeatherEntry.CONTENT_URI, null, null, null, null);

    // Make sure we get the correct cursor out of the database
    TestUtilities.validateCursor("testBasicWeatherQuery", weatherCursor, weatherValues);
  }
Esempio n. 10
0
  public void testLocationTable() {
    // First step: Get reference to writable database
    SQLiteDatabase db = new WeatherDbHelper(this.mContext).getWritableDatabase();

    // Create ContentValues of what you want to insert
    // (you can use the createWeatherValues TestUtilities function if you wish)
    ContentValues locationValues = TestUtilities.createNorthPoleLocationValues();

    // Insert ContentValues into database and get a row ID back
    long locationRowId = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, locationValues);
    assertFalse("Insert failed", locationRowId == -1);

    // Query the database and receive a Cursor back
    Cursor c =
        db.query(
            WeatherContract.LocationEntry.TABLE_NAME, // Table to Query
            null, // leaving "columns" null just returns all the columns.
            null, // cols for "where" clause
            null, // values for "where" clause
            null, // columns to group by
            null, // columns to filter by row groups
            null // sort order
            );

    // Move the cursor to a valid database row
    assertTrue("No records returned from location query", c.moveToFirst());

    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    TestUtilities.validateCurrentRecord(
        "testInsertReadDb locationEntry failed to validate", c, locationValues);

    // Finally, close the cursor and database
    c.close();
    db.close();
  }
Esempio n. 11
0
  /*
     Students: This is a helper method for the testWeatherTable quiz. You can move your
     code from testLocationTable to here so that you can call this code from both
     testWeatherTable and testLocationTable.
  */
  public long insertLocation() {
    // First step: Get reference to writable database

    WeatherDbHelper dbHelper = new WeatherDbHelper(mContext);
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    // Create ContentValues of what you want to insert
    // (you can use the createNorthPoleLocationValues if you wish)
    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();

    // Insert ContentValues into database and get a row ID back
    long locationRowId;
    locationRowId = db.insert(WeatherContract.LocationEntry.TABLE_NAME, null, testValues);

    assertTrue(locationRowId != -1);

    // Query the database and receive a Cursor back
    Cursor cursor =
        db.query(WeatherContract.LocationEntry.TABLE_NAME, null, null, null, null, null, null);

    assertTrue("Error: No Records returned from location query", cursor.moveToFirst());

    // Move the cursor to a valid database row
    TestUtilities.validateCurrentRecord(
        "Error: Location Query Validation Failed", cursor, testValues);

    // Validate data in resulting Cursor with the original ContentValues
    // (you can use the validateCurrentRecord function in TestUtilities to validate the
    // query if you like)
    assertFalse("Error: More than one record returned from location query", cursor.moveToNext());

    // Finally, close the cursor and database
    cursor.close();
    db.close();
    return locationRowId;
  }
Esempio n. 12
0
  // Student: Uncomment this test after you have completed writing the BulkInsert functionality
  // in your provider.  Note that this test will work with the built-in (default) provider
  // implementation, which just inserts records one-at-a-time, so really do implement the
  // BulkInsert ContentProvider function.
  public void testBulkInsert() {
    // first, let's create a location value
    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();
    Uri locationUri = mContext.getContentResolver().insert(LocationEntry.CONTENT_URI, testValues);
    long locationRowId = ContentUris.parseId(locationUri);

    // Verify we got a row back.
    assertTrue(locationRowId != -1);

    // Data's inserted.  IN THEORY.  Now pull some out to stare at it and verify it made
    // the round trip.

    // A cursor is your primary interface to the query results.
    Cursor cursor =
        mContext
            .getContentResolver()
            .query(
                LocationEntry.CONTENT_URI,
                null, // leaving "columns" null just returns all the columns.
                null, // cols for "where" clause
                null, // values for "where" clause
                null // sort order
                );

    TestUtilities.validateCursor(
        "testBulkInsert. Error validating LocationEntry.", cursor, testValues);

    // Now we can bulkInsert some weather.  In fact, we only implement BulkInsert for weather
    // entries.  With ContentProviders, you really only have to implement the features you
    // use, after all.
    ContentValues[] bulkInsertContentValues = createBulkInsertWeatherValues(locationRowId);

    // Register a content observer for our bulk insert.
    TestUtilities.TestContentObserver weatherObserver = TestUtilities.getTestContentObserver();
    mContext
        .getContentResolver()
        .registerContentObserver(WeatherEntry.CONTENT_URI, true, weatherObserver);

    int insertCount =
        mContext.getContentResolver().bulkInsert(WeatherEntry.CONTENT_URI, bulkInsertContentValues);

    // Students:  If this fails, it means that you most-likely are not calling the
    // getContext().getContentResolver().notifyChange(uri, null); in your BulkInsert
    // ContentProvider method.
    weatherObserver.waitForNotificationOrFail();
    mContext.getContentResolver().unregisterContentObserver(weatherObserver);

    assertEquals(insertCount, BULK_INSERT_RECORDS_TO_INSERT);

    // A cursor is your primary interface to the query results.
    cursor =
        mContext
            .getContentResolver()
            .query(
                WeatherEntry.CONTENT_URI,
                null, // leaving "columns" null just returns all the columns.
                null, // cols for "where" clause
                null, // values for "where" clause
                WeatherEntry.DATE + " ASC" // sort order == by DATE ASCENDING
                );

    // we should have as many records in the database as we've inserted
    assertEquals(cursor.getCount(), BULK_INSERT_RECORDS_TO_INSERT);

    // and let's make sure they match the ones we created
    cursor.moveToFirst();
    for (int i = 0; i < BULK_INSERT_RECORDS_TO_INSERT; i++, cursor.moveToNext()) {
      TestUtilities.validateCurrentRecord(
          "testBulkInsert.  Error validating WeatherEntry " + i,
          cursor,
          bulkInsertContentValues[i]);
    }
    // cursor.close();
  }
Esempio n. 13
0
  // Make sure we can still delete after adding/updating stuff
  //
  // Student: Uncomment this test after you have completed writing the insert functionality
  // in your provider.  It relies on insertions with testInsertReadProvider, so insert and
  // query functionality must also be complete before this test can be used.
  public void testInsertReadProvider() {
    ContentValues testValues = TestUtilities.createNorthPoleLocationValues();

    // Register a content observer for our insert.  This time, directly with the content resolver
    TestUtilities.TestContentObserver tco = TestUtilities.getTestContentObserver();
    mContext.getContentResolver().registerContentObserver(LocationEntry.CONTENT_URI, true, tco);
    Uri locationUri = mContext.getContentResolver().insert(LocationEntry.CONTENT_URI, testValues);

    // Did our content observer get called?  Students:  If this fails, your insert location
    // isn't calling getContext().getContentResolver().notifyChange(uri, null);
    tco.waitForNotificationOrFail();
    mContext.getContentResolver().unregisterContentObserver(tco);

    long locationRowId = ContentUris.parseId(locationUri);

    // Verify we got a row back.
    assertTrue(locationRowId != -1);

    // Data's inserted.  IN THEORY.  Now pull some out to stare at it and verify it made
    // the round trip.

    // A cursor is your primary interface to the query results.
    Cursor cursor =
        mContext
            .getContentResolver()
            .query(
                LocationEntry.CONTENT_URI,
                null, // leaving "columns" null just returns all the columns.
                null, // cols for "where" clause
                null, // values for "where" clause
                null // sort order
                );

    TestUtilities.validateCursor(
        "testInsertReadProvider. Error validating LocationEntry.", cursor, testValues);

    // Fantastic.  Now that we have a location, add some weather!
    ContentValues weatherValues = TestUtilities.createWeatherValues(locationRowId);
    // The TestContentObserver is a one-shot class
    tco = TestUtilities.getTestContentObserver();

    mContext.getContentResolver().registerContentObserver(WeatherEntry.CONTENT_URI, true, tco);

    Uri weatherInsertUri =
        mContext.getContentResolver().insert(WeatherEntry.CONTENT_URI, weatherValues);
    assertTrue(weatherInsertUri != null);

    // Did our content observer get called?  Students:  If this fails, your insert weather
    // in your ContentProvider isn't calling
    // getContext().getContentResolver().notifyChange(uri, null);
    tco.waitForNotificationOrFail();
    mContext.getContentResolver().unregisterContentObserver(tco);

    // A cursor is your primary interface to the query results.
    Cursor weatherCursor =
        mContext
            .getContentResolver()
            .query(
                WeatherEntry.CONTENT_URI, // Table to Query
                null, // leaving "columns" null just returns all the columns.
                null, // cols for "where" clause
                null, // values for "where" clause
                null // columns to group by
                );

    TestUtilities.validateCursor(
        "testInsertReadProvider. Error validating WeatherEntry insert.",
        weatherCursor,
        weatherValues);

    // Add the location values in with the weather data so that we can make
    // sure that the join worked and we actually get all the values back
    weatherValues.putAll(testValues);

    // Get the joined Weather and Location data
    weatherCursor =
        mContext
            .getContentResolver()
            .query(
                WeatherEntry.weatherWithLocationUri(TestUtilities.TEST_LOCATION),
                null, // leaving "columns" null just returns all the columns.
                null, // cols for "where" clause
                null, // values for "where" clause
                null // sort order
                );
    TestUtilities.validateCursor(
        "testInsertReadProvider.  Error validating joined Weather and Location Data.",
        weatherCursor,
        weatherValues);

    // Get the joined Weather and Location data with a start date
    //        weatherCursor = mContext.getContentResolver().query(
    //                WeatherEntry.buildWeatherLocationWithStartDate(
    //                        TestUtilities.TEST_LOCATION, TestUtilities.TEST_DATE),
    //                null, // leaving "columns" null just returns all the columns.
    //                null, // cols for "where" clause
    //                null, // values for "where" clause
    //                null  // sort order
    //        );
    TestUtilities.validateCursor(
        "testInsertReadProvider.  Error validating joined Weather and Location Data with start date.",
        weatherCursor,
        weatherValues);

    // Get the joined Weather data for a specific date
    //
    TestUtilities.validateCursor(
        "testInsertReadProvider.  Error validating joined Weather and Location data for a specific date.",
        weatherCursor,
        weatherValues);
  }