Android Open Source - LitePal Dropper






From Project

Back to project page LitePal.

License

The source code is released under:

Apache License

If you think the Android project LitePal listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C)  Tony Green, Litepal Framework Open Source Project
 *// w  w w. ja  v a  2s  .  c o  m
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.litepal.tablemanager;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.litepal.model.Table_Schema;
import org.litepal.tablemanager.model.TableModel;
import org.litepal.util.BaseUtility;
import org.litepal.util.Const;
import org.litepal.util.LogUtil;

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

/**
 * When developers defined some model classes and define them in the mapping
 * list. All corresponding tables will be created automatically. But developers
 * might realize some model classes are useless or can be optimized to remove,
 * and they somehow drop the model classes. If the tables are still in the
 * database, it will be a mess soon. So this class helps do the dropping job.
 * Keep developers' database synchronized and clean.
 * 
 * @author Tony Green
 * @since 1.0
 */
public class Dropper extends AssociationUpdater {

  /**
   * Use the TableModel to get table name and columns name to generate SQL.
   */
  private Collection<TableModel> mTableModels;

  /**
   * Analyzing the table model, to see which tables has no model classes
   * anymore and can be dropped.
   */
  @Override
  protected void createOrUpgradeTable(SQLiteDatabase db, boolean force) {
    mTableModels = getAllTableModels();
    mDb = db;
    dropTables();
  }

  /**
   * Drop the tables which are not exist in the mapping list to keep
   * synchronization.
   */
  private void dropTables() {
    List<String> tableNamesToDrop = findTablesToDrop();
    dropTables(tableNamesToDrop, mDb);
    clearCopyInTableSchema(tableNamesToDrop);
  }

  /**
   * It will find all the tables need to drop in the database, following the
   * rules of {@link #shouldDropThisTable(String, int)}.
   * 
   * @return A list contains all the table names need to drop.
   */
  private List<String> findTablesToDrop() {
    List<String> dropTableNames = new ArrayList<String>();
    Cursor cursor = null;
    try {
      cursor = mDb.query(Const.TableSchema.TABLE_NAME, null, null, null, null, null, null);
      if (cursor.moveToFirst()) {
        do {
          String tableName = cursor.getString(cursor
              .getColumnIndexOrThrow(Const.TableSchema.COLUMN_NAME));
          int tableType = cursor.getInt(cursor
              .getColumnIndexOrThrow(Const.TableSchema.COLUMN_TYPE));
          if (shouldDropThisTable(tableName, tableType)) {
            // need to drop tableNameDB
            LogUtil.d(TAG, "need to drop " + tableName);
            dropTableNames.add(tableName);
          }
        } while (cursor.moveToNext());
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      if (cursor != null) {
        cursor.close();
      }
    }
    return dropTableNames;
  }

  /**
   * Get a list only with table names.
   * 
   * @return A list only contains table names.
   */
  private List<String> pickTableNamesFromTableModels() {
    List<String> tableNames = new ArrayList<String>();
    for (TableModel tableModel : mTableModels) {
      tableNames.add(tableModel.getTableName());
    }
    return tableNames;
  }

  /**
   * It gets all the table names generated by the mapping classes and create a
   * table name list. Compare table name list with the table name passed in.
   * If the table name is not existed in the table name list and the table
   * type is {@link Table_Schema#NORMAL_TABLE}, then this table should be
   * dropped.
   * 
   * @param tableName
   *            The table name to check.
   * @param tableType
   *            The table type to check.
   * @return If this table should be dropped return true. Otherwise return
   *         false.
   */
  private boolean shouldDropThisTable(String tableName, int tableType) {
    return !BaseUtility.containsIgnoreCases(pickTableNamesFromTableModels(), tableName)
        && tableType == Const.TableSchema.NORMAL_TABLE;
  }
}




Java Source Code List

org.litepal.LitePalApplication.java
org.litepal.LitePalBase.java
org.litepal.crud.AssociationsAnalyzer.java
org.litepal.crud.ClusterQuery.java
org.litepal.crud.DataHandler.java
org.litepal.crud.DataSupport.java
org.litepal.crud.DeleteHandler.java
org.litepal.crud.DynamicExecutor.java
org.litepal.crud.Many2ManyAnalyzer.java
org.litepal.crud.Many2OneAnalyzer.java
org.litepal.crud.One2OneAnalyzer.java
org.litepal.crud.QueryHandler.java
org.litepal.crud.SaveHandler.java
org.litepal.crud.UpdateHandler.java
org.litepal.crud.model.AssociationsInfo.java
org.litepal.exceptions.DataSupportException.java
org.litepal.exceptions.DatabaseGenerateException.java
org.litepal.exceptions.GlobalException.java
org.litepal.exceptions.InvalidAttributesException.java
org.litepal.exceptions.ParseConfigurationFileException.java
org.litepal.litepalsample.activity.AggregateActivity.java
org.litepal.litepalsample.activity.AverageSampleActivity.java
org.litepal.litepalsample.activity.CRUDActivity.java
org.litepal.litepalsample.activity.CountSampleActivity.java
org.litepal.litepalsample.activity.DeleteSampleActivity.java
org.litepal.litepalsample.activity.MainActivity.java
org.litepal.litepalsample.activity.ManageTablesActivity.java
org.litepal.litepalsample.activity.MaxSampleActivity.java
org.litepal.litepalsample.activity.MinSampleActivity.java
org.litepal.litepalsample.activity.ModelListActivity.java
org.litepal.litepalsample.activity.ModelStructureActivity.java
org.litepal.litepalsample.activity.QuerySampleActivity.java
org.litepal.litepalsample.activity.SaveSampleActivity.java
org.litepal.litepalsample.activity.SumSampleActivity.java
org.litepal.litepalsample.activity.TableListActivity.java
org.litepal.litepalsample.activity.TableStructureActivity.java
org.litepal.litepalsample.activity.UpdateSampleActivity.java
org.litepal.litepalsample.adapter.DataArrayAdapter.java
org.litepal.litepalsample.adapter.StringArrayAdapter.java
org.litepal.litepalsample.model.Album.java
org.litepal.litepalsample.model.Singer.java
org.litepal.litepalsample.model.Song.java
org.litepal.litepalsample.util.Utility.java
org.litepal.model.Table_Schema.java
org.litepal.parser.LitePalAttr.java
org.litepal.parser.LitePalContentHandler.java
org.litepal.parser.LitePalParser.java
org.litepal.tablemanager.AssociationCreator.java
org.litepal.tablemanager.AssociationUpdater.java
org.litepal.tablemanager.Connector.java
org.litepal.tablemanager.Creator.java
org.litepal.tablemanager.Dropper.java
org.litepal.tablemanager.Generator.java
org.litepal.tablemanager.LitePalOpenHelper.java
org.litepal.tablemanager.Upgrader.java
org.litepal.tablemanager.model.AssociationsModel.java
org.litepal.tablemanager.model.TableModel.java
org.litepal.tablemanager.typechange.BooleanOrm.java
org.litepal.tablemanager.typechange.DateOrm.java
org.litepal.tablemanager.typechange.DecimalOrm.java
org.litepal.tablemanager.typechange.NumericOrm.java
org.litepal.tablemanager.typechange.OrmChange.java
org.litepal.tablemanager.typechange.TextOrm.java
org.litepal.util.BaseUtility.java
org.litepal.util.Const.java
org.litepal.util.DBUtility.java
org.litepal.util.LogUtil.java
org.litepal.util.SharedUtil.java