SQLiteColumnInfo.java

package net.zer0bandwidth.android.lib.database;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Contains information returned by the {@code table_info} pragma in SQLite.
 * @since zer0bandwidth-net/android 0.1.4 (#26)
 */
public class SQLiteColumnInfo
{
	/**
	 * Gathers information about the columns in the specified table, and returns
	 * the column descriptions in a list.
	 * @param db the database to be analyzed
	 * @param sTableName the name of the table to be analyzed
	 * @return a list of objects describing the columns of the table
	 * @see SQLitePortal#getColumnListForTable
	 */
	public static List<SQLiteColumnInfo> gatherColumnList(
			SQLiteDatabase db, String sTableName )
	{
		Cursor crs = null ;
		List<SQLiteColumnInfo> aInfo = new ArrayList<>() ;
		try
		{
			crs = db.rawQuery(
					String.format( "PRAGMA main.table_info('%s')", sTableName ),
					null ) ;
			if( crs.moveToFirst() )
			{
				do
				{
					SQLiteColumnInfo info = new SQLiteColumnInfo() ;
					info.sTableName = sTableName ;
					info.nColumnID = crs.getInt(0) ;
					info.sColumnName = crs.getString(1) ;
					info.sColumnType = crs.getString(2) ;
					info.bNotNull = SQLitePortal.intToBool( crs.getInt(3) ) ;
					info.sDefault = crs.getString(4) ;
					info.bPrimaryKey = SQLitePortal.intToBool( crs.getInt(5) ) ;
					aInfo.add(info) ;
				} while( crs.moveToNext() ) ;
			}
		}
		finally
		{ SQLitePortal.closeCursor(crs) ; }

		return aInfo ;
	}

	/**
	 * Gathers information about the columns in the specified table, and returns
	 * the column descriptions in a map.
	 * @param db the database to be analyzed
	 * @param sTableName the name of the table to be analyzed
	 * @return a map of column names to objects describing those columns
	 * @see SQLitePortal#getColumnMapForTable
	 */
	public static Map<String,SQLiteColumnInfo> gatherColumnMap(
			SQLiteDatabase db, String sTableName )
	{
		List<SQLiteColumnInfo> aInfo = gatherColumnList( db, sTableName ) ;
		Map<String,SQLiteColumnInfo> mapInfo = new HashMap<>() ;
		for( SQLiteColumnInfo info : aInfo )
			mapInfo.put( info.sColumnName, info ) ;
		return mapInfo ;
	}

	/** The name of the table containing this column. */
	public String sTableName = null ;

	/** The numeric ID of the column in any given row. */
	public int nColumnID = -1 ;

	/** The name of the column in the table definition. */
	public String sColumnName = null ;

	/** The magic SQLite token indicating this column's data type. */
	public String sColumnType = null ;

	/** Indicates whether the column is defined {@code NOT NULL}. */
	public boolean bNotNull = false ;

	/** The default value of the column, as a string. */
	public String sDefault = null ;

	/** Indicates whether the column is the table's primary key. */
	public boolean bPrimaryKey = false ;
}