SQLite databases are commonly used for on-device storage of data. Databases can be created and manipulated using the standard SQL commands. The following example uses a Contract class file to define the names of the table columns and the URI for the Content Authority, which would allow a third-party app access to the data in your database if you wished it to be a Content Provider:
Create a Contract class:
import android.content.ContentResolver;
import android.content.ContentUris;
import android.net.Uri;
import android.provider.BaseColumns;
public class ExampleContract implements BaseColumns {
// This is the content authority for our app Content Provider.
public static final String CONTENT_AUTHORITY = "com.example.android.ourapp";
// This is the {@link Uri} on which all other Uris for our app are built.
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
// The path for a particular database of data e.g. 'data'
public static final String PATH_DATA = "data";
// This is the {@link Uri} used to get a full list of names and ages.
public static final Uri CONTENT_URI =
BASE_CONTENT_URI.buildUpon().appendPath(PATH_DATA).build();
// This is a String type that denotes a Uri references a list or directory.
public static final String CONTENT_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_TERMS;
// This is a String type that denotes a Uri references a single item.
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_TERMS;
// Declaring all these as constants makes code a lot more readable.
// It also looks a more like SQL.
// This is the version of the database
public static final int DATABASE_VERSION = 1;
// This is the name of the SQL table for data.
public static final String DATA_TABLE = "data_entries";
// This is the name of the SQL database for data.
public static final String DATABASE_NAME = "data";
// This is the column name in the SQLiteDatabase for our first column, 'name'.
public static final String COLUMN_NAME = "name";
// This is the column name in the SQLiteDatabase for our first column, 'age'.
public static final String COLUMN_AGE = "age";
// This is an array containing all the column headers in the data table.
public static final String[] COLUMNS =
{_ID, COLUMN_NAME, COLUMN_AGE};
// This is the index of the ID in the data table
public static final int COLUMN_INDEX_ID = 0;
// This is the index of the name in the data table
public static final int COLUMN_INDEX_NAME = 1;
// This is the index of the age in the data table
public static final int COLUMN_INDEX_AGE = 2;
/**
* This method creates a {@link Uri} for a single piece of data, referenced by id.
* @param id The id of the term.
* @return The Uri with the appended id.
*/
public static Uri buildDataUriWithId(long id) {
return ContentUris.withAppendedId(CONTENT_URI, id);
}
}
Create a helper class to handle the SQL commands (in separate class file):
public class DataDbHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "data.db";
private static final int DATABASE_VERSION = 1;
public DataDbHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
/*
* This String will contain a simple SQL statement that will create a table that will
* cache our data.
*/
final String SQL_CREATE_DATA_TABLE =
"CREATE TABLE " + ExampleContract.DATA_TABLE + " (" +
/*
* Our contract did not explicitly declare a column called "_ID". However,
* it implements the interface "BaseColumns" which does have a field
* named "_ID". We use that here to designate our table's primary key.
*/
ExampleContract._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
ExampleContract.COLUMN_NAME + " VARCHAR, " +
ExampleContract.COLUMN_AGE + " VARCHAR" + ");";
/*
* After we've spelled out our SQLite table creation statement above, we actually execute
* that SQL with the execSQL method of our SQLite database object.
*/
db.execSQL(SQL_CREATE_DATA_TABLE);
}
/**
* This example database is only a cache for online data, so its upgrade policy is simply to discard
* the data and call through to onCreate to recreate the table. Note that this only fires if
* you change the version number for your database (in our case, DATABASE_VERSION). It does NOT
* depend on the version number for your application found in your app/build.gradle file. If
* you want to update the schema without wiping data, commenting out the current body of this
* method should be your top priority before modifying this method.
*
* @param sqLiteDatabase Database that is being upgraded
* @param oldVersion The old database version
* @param newVersion The new database version
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + ExampleContract.DATA_TABLE);
onCreate(db);
}
}
To make use of this database use a Cursor
ud851-Sunshine-student\S07.03???