DataTable.java :  » GPS » tripcomputer » pl » tripcomputer » data » common » Android Open Source

Android Open Source » GPS » tripcomputer 
tripcomputer » pl » tripcomputer » data » common » DataTable.java
package pl.tripcomputer.data.common;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import pl.tripcomputer.Command;
import pl.tripcomputer.UserAlert;
import android.database.Cursor;


public abstract class DataTable extends Observable
{
  //fields
  public static final String sID = "_ID";

  public static class field
  {
    public static final int ID = 0;
  }
  
  
  //fields
  protected Database dataBase = null;
  protected String sTableName = null;
  protected DataField[] vecTableDefinition = null;  

  private boolean bTableExists = false;

  
  //check for correct values before update
  public abstract UserAlert.Result validateValues(DataValues values);
  
  //get code current version of table structure
  public abstract int getTableVersion();

  //get default values for insert
  public abstract DataValues getNewValues(boolean bForInsert);

  
  //methods
  public DataTable(Database dataBase, String sTableName, DataField[] vecTableDefinition)
  {
    this.dataBase = dataBase;
    this.sTableName = sTableName;
    this.vecTableDefinition = vecTableDefinition;
  }

  public String getTableName()
  {
    return sTableName;
  }
  
  public String getFieldName(int id)
  {
    return vecTableDefinition[id].sFieldName;    
  }
  
  private String getSqlTableDefinition()
  {
    String def = "CREATE TABLE " + sTableName + " (";
    for (int i = 0; i < vecTableDefinition.length; i++)
    {
      final DataField field = vecTableDefinition[i];      
      def += field.getColumnDefinition();
      if (i < (vecTableDefinition.length - 1))
        def += ", ";
    }
    def += ")";
    return def;
  }
  
  public boolean createTable()
  {
    if (dataBase.tableExists(sTableName))
    {
      bTableExists = true;
    } else {
      final String sql = getSqlTableDefinition();
      bTableExists = dataBase.executeSQL(sql);
      
      if (bTableExists)
        dataBase.tableVersion().setVersion(sTableName, getTableVersion());
    }

    return bTableExists;
  }  

  public boolean checkExistence()
  {
    if (dataBase.tableExists(sTableName))
    {
      bTableExists = true;
    }
    return bTableExists;
  }  
  
  public boolean exists()
  {
    return bTableExists;
  }  
  
  public long dataInsert(DataValues values)
  {    
    final long lNewRowId = dataBase.insert(sTableName, values.get()); 
    return lNewRowId;
  }
  
  public boolean dataUpdate(DataValues values, long lRowId)
  {
    final String sWhere = String.format("_ID = %d", lRowId);
     final int iRowsAffected = dataBase.update(sTableName, values.get(), sWhere);
     return (iRowsAffected > 0);      
  }

  public boolean dataDelete(long lRowId)
  {
    final String sWhere = String.format("_ID = %d", lRowId);
     final int iRowsAffected = dataBase.delete(sTableName, sWhere);
     return (iRowsAffected > 0);
  }

  public boolean dataDelete(String sWhere)
  {
     final int iRowsAffected = dataBase.delete(sTableName, sWhere);
     return (iRowsAffected > 0);
  }
      
  public boolean isRecord(long lRecordId)
  {    
    final Cursor cr = getDataRecord(lRecordId);
    if (cr != null)
    {
      cr.close();    
      return true;
    }
    return false;
  }
  
  public ArrayList<Long> getRowsIdList(String sWhere, String sOrderBy)
  {
    ArrayList<Long> list = new ArrayList<Long>(); 

    final Cursor cr = getDataRecords(sWhere, sOrderBy);
    if (cr != null)
    {
      while (!cr.isAfterLast())
      {
        final Long lID = new Long(cr.getLong(field.ID));
        list.add(lID);
        cr.moveToNext();
      }
      cr.close();
    }
    
    return list;
  }
  
  public Cursor getDataRecords()
  {
    return getDataRecords(null, null);
  }

  public Cursor getDataRecords(String sWhere)
  {
    return getDataRecords(sWhere, null);
  }
    
  public Cursor getDataRecord(long lRowId)
  {
    Cursor cr = null;      
    if (exists())
    {
      final String sql = String.format("select * from %s where _ID = %d", sTableName, lRowId);        
      cr = dataBase.query(sql);
      if (cr != null)
      {
        if (cr.getCount() == 0)
        {
          cr.close();
          cr = null;
        } else {
          cr.moveToFirst();
        }
      }        
    }      
    return cr;
  }  
  
  public Cursor getDataRecords(String sWhere, String sOrderBy)
  {
    String sWhereString = "";
    if (sWhere != null)
      sWhereString = "where " + sWhere;
    
    String sOrderByString = "order by _ID";
    if (sOrderBy != null)
      sOrderByString = "order by " + sOrderBy;
    
    Cursor cr = null;
    if (exists())
    {        
      final String sql = String.format("select * from %s %s %s", sTableName, sWhereString, sOrderByString);
      cr = dataBase.query(sql);      
      if (cr != null)
      {
        if (cr.getCount() == 0)
        {
          cr.close();
          cr = null;
        } else {
          cr.moveToFirst();
        }
      }        
    }
    return cr;      
  }  
  
  public boolean isEmpty()
  {
    int iCount = 0;
    if (exists())
    {              
      final String sql = String.format("select * from %s", sTableName);
      final Cursor cr = dataBase.query(sql);
      if (cr != null)
      {
        iCount = cr.getCount();
         cr.close();
      }
    }
    return (iCount == 0);
  }

  public int getCount(String sWhere)
  {
    String sWhereString = "";
    if (sWhere != null)
      sWhereString = "where " + sWhere;
    
    int iCount = 0;
    if (exists())
    {              
      final String sql = String.format("select * from %s %s", sTableName, sWhereString);
      final Cursor cr = dataBase.query(sql);
      if (cr != null)
      {
        iCount = cr.getCount();
         cr.close();
      }
    }
    return iCount;
  }
  
  public int getCount()
  {
    return getCount(null);
  }

  //sends data operation to observers
  public void sendOperation(long lRowId, int iDataOperation)
  {  
    sendOperation(lRowId, iDataOperation, Command.CMD_NONE, null);
  }
  
  //sends data operation to observers with command and trackname
  public void sendOperation(long lRowId, int iDataOperation, int iCommand, String sTrackName)
  {  
    //do not notify observers in middle of transaction
    if (dataBase.isInTransaction())
      return;
    
    DataTableOperation op = new DataTableOperation();
    op.lRowId = lRowId;
    op.iOperation = iDataOperation;
    op.iCommand = iCommand;
    op.sTrackName = sTrackName;
    
    setChanged();  
    notifyObservers(op);
  }

  public void updateObserver(Observer observer)
  {
    deleteObserver(observer);
    addObserver(observer);    
  }
  
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.