code: public TTable readTable(
  			UserCoreConnection<TColumn, TTable, TRow, TResult> db) {
  
  		List<TColumn> columnList = new ArrayList<TColumn>();
  
  		TResult result = db.rawQuery(
  				"PRAGMA table_info(" + CoreSQLUtils.quoteWrap(tableName) + ")",
  				null);
  		try {
  			while (result.moveToNext()) {
  				int index = result.getInt(result.getColumnIndex(CID));
  				String name = result.getString(result.getColumnIndex(NAME));
  				String type = result.getString(result.getColumnIndex(TYPE));
  				boolean notNull = result
  						.getInt(result.getColumnIndex(NOT_NULL)) == 1;
  				boolean primaryKey = result.getInt(result.getColumnIndex(PK)) == 1;
  
  				// If the type has a max limit on it, pull it off
  				Long max = null;
  				if (type != null && type.endsWith(")")) {
  					int maxStart = type.indexOf("(");
  					if (maxStart > -1) {
  						String maxString = type.substring(maxStart + 1,
  								type.length() - 1);
  						if (!maxString.isEmpty()) {
  							try {
  								max = Long.valueOf(maxString);
  								type = type.substring(0, maxStart);
  							} catch (NumberFormatException e) {
  								logger.log(Level.WARNING,
  										"Failed to parse type max from type: "
  												+ type, e);
  							}
  						}
  					}
  				}
  
  				// Get the geometry or data type and default value
  				int defaultValueIndex = result.getColumnIndex(DFLT_VALUE);
  
  				TColumn column = createColumn(result, index, name, type, max,
  						notNull, defaultValueIndex, primaryKey);
  				columnList.add(column);
  			}
  		} finally {
  			result.close();
  		}
  		if (columnList.isEmpty()) {
  			throw new GeoPackageException("Table does not exist: " + tableName);
  		}
  
  		return createTable(tableName, columnList);
  	}
docs: Read the table
  
  @param db
  user connection
  @return table