= Database: SQLite =
==== DB Connector ====
When using the built-in ''android.database.sqlite'' library, there is not need to add an additional database connector.
==== Manifest ====
Add permission to access the Internet. Go to ''app'' > ''manifests'' > ''AndroidManifest.xml'':
==== Database Contract ====
Create a class to hold the database strings:
File ''DbContract.java'':
package com.acme.myapp;
import android.provider.BaseColumns;
public final class DbContract
{
// To prevent someone from accidentally instantiating the contract class,
// make the constructor private.
private DbContract() {}
/* Inner class that defines the table contents */
public class TeamEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COL_NAME = "name";
public static final String COL_NUMBER = "number";
public static final String COL_RANKING = "ranking";
}
}
==== Database Helper ====
Create a class to hold the database strings:
File ''DbHelper.java'':
package com.acme.myapp;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DbHelper extends SQLiteOpenHelper
{
//-----------------------------------
// If you change the database schema, you must increment the database version.
//-----------------------------------
// Properties
public static final String DATABASE_NAME = "database.db";
public static final int DATABASE_VERSION = 1;
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + DbContract.TeamEntry.TABLE_NAME + " (" +
DbContract.TeamEntry._ID + " INTEGER PRIMARY KEY," +
DbContract.TeamEntry.COL_NAME + " TEXT," +
DbContract.TeamEntry.COL_NUMBER + " TEXT," +
DbContract.TeamEntry.COL_RANKING + " TEXT)";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + DbContract.TeamEntry.TABLE_NAME;
//-----------------------------------
// Methods
//-----------------------------------
public DbHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Boolean createDatabase = false;
if(createDatabase) {
SQLiteDatabase db = this.getWritableDatabase();
}
}
public void onCreate(SQLiteDatabase db)
{
db.execSQL(SQL_CREATE_ENTRIES);
// Add content to table
for(int i=1; i <= 20; i++) {
ContentValues values = new ContentValues();
values.put(DbContract.TeamEntry.COL_NAME, "Team " + i);
values.put(DbContract.TeamEntry.COL_NUMBER, i + "");
// Insert the new row, returning the primary key value of the new row
db.insert(DbContract.TeamEntry.TABLE_NAME, null, values);
}
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
onUpgrade(db, oldVersion, newVersion);
}
public String getDbVersionNumber()
{
String query = "select sqlite_version() AS sqlite_version";
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(":memory:", null);
Cursor cursor = db.rawQuery(query, null);
String sqliteVersion = "";
if (cursor.moveToNext()) {
sqliteVersion = cursor.getString(0);
}
return sqliteVersion;
}
}
==== Database Utils ====
Create a class to hold the database strings:
File ''DbUtils.java'':
package com.acme.myapp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import java.util.ArrayList;
import java.util.List;
public class DbUtils
{
private DbHelper dbHelper;
private SQLiteDatabase db;
public DbHelper getConnection(Context cx)
{
dbHelper = new DbHelper(cx);
return dbHelper;
}
public long addTeamRecord()
{
// Gets the data repository in write mode
SQLiteDatabase db = dbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(DbContract.TeamEntry.COL_NAME, "Team A");
values.put(DbContract.TeamEntry.COL_NUMBER, "1234");
// Insert the new row, returning the primary key value of the new row
long newRowId = db.insert(DbContract.TeamEntry.TABLE_NAME, null, values);
return newRowId;
}
public List readTeamRecords()
{
db = dbHelper.getReadableDatabase();
// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
BaseColumns._ID,
DbContract.TeamEntry.COL_NAME,
DbContract.TeamEntry.COL_NUMBER,
DbContract.TeamEntry.COL_RANKING
};
// Filter results WHERE "title" = 'My Team'
String selection = DbContract.TeamEntry.COL_NAME + " = ?";
String[] selectionArgs = { "My Team" };
// How you want the results sorted in the resulting Cursor
String sortOrder = DbContract.TeamEntry.COL_NUMBER + " DESC";
Cursor cursor = db.query(
DbContract. TeamEntry.TABLE_NAME, // The table to query
projection, // The array of columns to return (pass null to get all)
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
List itemIds = new ArrayList<>();
while(cursor.moveToNext()) {
long itemId = cursor.getLong( cursor.getColumnIndexOrThrow(DbContract.TeamEntry._ID) );
itemIds.add(itemId);
}
cursor.close();
return itemIds;
}
public Map findTeamRecordsAll()
{
db = dbHelper.getReadableDatabase();
// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
BaseColumns._ID,
DbContract.TeamEntry.COL_NAME,
DbContract.TeamEntry.COL_NUMBER,
DbContract.TeamEntry.COL_RANKING
};
// Filter results WHERE "title" = 'My Team'
//String selection = DbContract.TeamEntry.COL_NAME + " = ?";
//String[] selectionArgs = { "My Team" };
String selection = null; // no filters
String[] selectionArgs = null; // no filters
// How you want the results sorted in the resulting Cursor
//String sortOrder = DbContract.TeamEntry.COL_NUMBER + " ASC";
String sortOrder = DbContract.TeamEntry.COL_NAME + " ASC";
Cursor cursor = db.query(
DbContract.TeamEntry.TABLE_NAME, // The table to query
projection, // The array of columns to return (pass null to get all)
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
Map mapTeam = new LinkedHashMap();
while(cursor.moveToNext()) {
String name = cursor.getString( cursor.getColumnIndexOrThrow(DbContract.TeamEntry.COL_NAME) );
String number = cursor.getString( cursor.getColumnIndexOrThrow(DbContract.TeamEntry.COL_NUMBER) );
mapTeam.put(name,number);
}
cursor.close();
return mapTeam;
}
public List findTeamNamesAll()
{
try {
db = dbHelper.getReadableDatabase();
} catch (Exception ex) {
ex.printStackTrace();
}
// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
BaseColumns._ID,
DbContract.TeamEntry.COL_NAME,
DbContract.TeamEntry.COL_NUMBER,
DbContract.TeamEntry.COL_RANKING
};
// Filter results WHERE "title" = 'My Team'
//String selection = DbContract.TeamEntry.COL_NAME + " = ?";
//String[] selectionArgs = { "My Team" };
String selection = null; // no filters
String[] selectionArgs = null; // no filters
// How you want the results sorted in the resulting Cursor
//String sortOrder = DbContract.TeamEntry.COL_NUMBER + " ASC";
String sortOrder = DbContract.TeamEntry.COL_NAME + " ASC";
Cursor cursor = db.query(
DbContract.TeamEntry.TABLE_NAME, // The table to query
projection, // The array of columns to return (pass null to get all)
//selection, // The columns for the WHERE clause
//selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
List arrNames = new ArrayList();
while(cursor.moveToNext()) {
String name = cursor.getString( cursor.getColumnIndexOrThrow(DbContract.TeamEntry.COL_NAME) );
arrNames.add(name);
}
cursor.close();
return arrNames;
}
public void deleteTeamRecord()
{
// Define selection filter
String selection = DbContract.TeamEntry.COL_NAME + " LIKE ?";
String[] selectionArgs = { "MyTeam" };
// Issue SQL statement.
int deletedRows = db.delete(DbContract.TeamEntry.TABLE_NAME, selection, selectionArgs);
}
public int updateTeamRecords()
{
SQLiteDatabase db = dbHelper.getWritableDatabase();
// New value for one column
String name = "MyNewTeam";
ContentValues values = new ContentValues();
values.put(DbContract.TeamEntry.COL_NAME, name);
// Which row to update, based on the title
String selection = DbContract.TeamEntry.COL_NAME + " LIKE ?";
String[] selectionArgs = { "MyOldTeam" };
int count = db.update(
DbContract.TeamEntry.TABLE_NAME,
values,
selection,
selectionArgs
);
return count;
}
public void destroy()
{
dbHelper.close();
}
}
=== MainActivity ===
public class MainActivity extends AppCompatActivity {
// Const
private static final String TAG = "ROBOTICS_LEAGUE_APP";
// Properties
ListView lstTeams;
String[] arrTeams;
List teamNames;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Connect to resources
Resources res = getResources();
lstTeams = (ListView) findViewById(R.id.lstTeams);
//arrTeams = res.getStringArray(R.array.teams); // get data from resource stings
try {
DbUtils dbutil = new DbUtils();
dbutil.getConnection(this);
teamNames = dbutil.findTeamNamesAll(); // get data from database
} catch (Exception ex) {
ex.printStackTrace();
}
// Using custom ItemAdapter with custom layout
TeamItemAdapter itemAdapter = new TeamItemAdapter(
this, // context
//arrTeams // data
teamNames // data
);
lstTeams.setAdapter(itemAdapter);
lstTeams.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Log.d(TAG, "Loading rubric for Team " + (position+1));
Toast.makeText(getApplicationContext(), "Loading rubric for Team " + (position+1), Toast.LENGTH_SHORT).show();
Intent showRubricActivity = new Intent(getApplicationContext(), RobotRubricActivity.class);
showRubricActivity.putExtra("com.acme.roboticsleague.TEAM_ID", (position+1)+"");
showRubricActivity.putExtra("com.acme.roboticsleague.TEAM_INDEX", position);
startActivity(showRubricActivity);
}
});
}
}
activiy_main.xml Layout:
=== ItemAdapter ===
package com.acme.myapp;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class TeamItemAdapter extends BaseAdapter {
LayoutInflater mInflater;
//String[] arrTeams;
List arrTeams;
//public TeamItemAdapter(Context cx, String[] teams)
public TeamItemAdapter(Context cx, List teams)
{
arrTeams = teams;
mInflater = (LayoutInflater) cx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
//public int getCount()
//{
// return arrTeams.length;
//}
public int getCount()
{
return arrTeams.size();
}
@Override
//public Object getItem(int idx)
//{
// return arrTeams[idx];
//}
public Object getItem(int idx)
{
return arrTeams.get(idx);
}
@Override
public long getItemId(int idx)
{
return idx;
}
@Override
public View getView(int idx, View view, ViewGroup viewGroup)
{
// Use layout inflater. Use listview_detail_team.xml layout
View vw = mInflater.inflate(R.layout.listview_detail_team, null);
TextView lblItemNumber = (TextView) vw.findViewById(R.id.lblItemNumber);
TextView lblTeamName = (TextView) vw.findViewById(R.id.lblTeamName);
String strItemNumber = (idx+1) + "";
//String strTeam = arrTeams[idx];
String strTeam = arrTeams.get(idx);
lblItemNumber.setText(strItemNumber);
lblTeamName.setText(strTeam);
return vw;
}
}
== References ==
See also:
* [[swdev:java:Connecting to MYSQL Database]]
* [[https://developer.android.com/training/data-storage/sqlite|Data Storage: SQLite]]
* [[https://developer.android.com/training/data-storage/room|Data Storage: Room]]
* [[https://dzone.com/articles/create-a-database-android-application-in-android-s|Create a database Android application]]