создать / открыть базу данных после закрытия

1

В моем приложении после входа пользователя в систему создается база данных. Когда пользователь выходит из системы, я должен удалить базу данных из внутреннего хранилища, чтобы сэкономить место. Проблема заключается в том, что после удаления базы данных и регистрации пользователя снова база данных больше не может быть создана. Я попытался использовать.close(), но это только ухудшает проблему. Вот мой код. DatabaseHelper

    public class DatabaseHelper extends OrmLiteSqliteOpenHelper {

private static final String DATABASE_PATH = "/mnt/sdcard/Philpost/databases/";

private static final String DATABASE_NAME = "DeliveriesDB.sqlite";

private static final int DATABASE_VERSION = 1;

// the DAO object we use to access the SimpleData table
private Dao<DeliveriesDB, Integer> DeliveriesDbDao = null;

public DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase database,
        ConnectionSource connectionSource) {
    try {
        TableUtils.createTable(connectionSource, DeliveriesDB.class);
    } catch (SQLException e) {
        Log.e(DatabaseHelper.class.getName(), "Can't create database", e);
        throw new RuntimeException(e);
    } catch (java.sql.SQLException e) {
        e.printStackTrace();
    }

}

@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
        int oldVersion, int newVersion) {
    try {
        Log.i(DatabaseHelper.class.getName(), "onUpgrade");
        TableUtils.dropTable(connectionSource, DatabaseHelper.class, true);
        onCreate(db, connectionSource);
    } catch (java.sql.SQLException e) {
        // TODO Auto-generated catch block
        Log.e(DatabaseHelper.class.getName(), "Cant drop database", e);
        e.printStackTrace();
    }
}

public Dao<DeliveriesDB, Integer> getDeliveriesDbDao() {
    if (null == DeliveriesDbDao) {
        try {
            DeliveriesDbDao = getDao(DeliveriesDB.class);
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
        }
    }
    return DeliveriesDbDao;
}

    }

DatabaseManager

    public class DatabaseManager {

static private DatabaseManager instance;

static public void init(Context ctx) {
    if (null == instance) {
        instance = new DatabaseManager(ctx);
    }
}

static public DatabaseManager getInstance() {
    return instance;
}

private DatabaseHelper helper;

public DatabaseManager(Context ctx) {
    helper = new DatabaseHelper(ctx);
}

public DatabaseHelper getHelper(Context ctx) {
    if(helper == null){
        helper = OpenHelperManager.getHelper(ctx, DatabaseHelper.class);
    }
    return helper;
}

public void releaseDb(Context ctx) {
    DatabaseConnection connect;
    try {
        connect = getHelper(ctx).getConnectionSource()
                .getReadWriteConnection();
        getHelper(ctx).getConnectionSource().releaseConnection(connect);
        helper = null;
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void closeDb(){
    helper.close();
}

public List<DeliveriesDB> getAllDeliveriesDB(Context ctx) {
    List<DeliveriesDB> deliveriesdb = null;
    try {
        deliveriesdb = getHelper(ctx).getDeliveriesDbDao().queryForAll();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return deliveriesdb;
}

public void addDeliveriesDb(DeliveriesDB l, Context ctx) {
    try {
        getHelper(ctx).getDeliveriesDbDao().create(l);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public DeliveriesDB getDeliveriesDbWithId(int deliveriesDbId, Context ctx) {
    DeliveriesDB deliveriesDb = null;
    try {
        deliveriesDb = getHelper(ctx).getDeliveriesDbDao().queryForId(
                deliveriesDbId);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return deliveriesDb;
}

public void deleteDeliveriesDb(DeliveriesDB deliveriesDb, Context ctx) {
    try {
        getHelper(ctx).getDeliveriesDbDao().delete(deliveriesDb);
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

public void refreshDeliveriesDb(DeliveriesDB deliveriesDb, Context ctx) {
    try {
        getHelper(ctx).getDeliveriesDbDao().refresh(deliveriesDb);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public void updateDeliveriesDb(DeliveriesDB deliveriesDb, Context ctx) {
    try {
        getHelper(ctx).getDeliveriesDbDao().update(deliveriesDb);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

    }

Класс, в котором происходит создание и удаление базы данных

    public class DeliveryListActivity extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    DatabaseManager.init(this);

    setContentView(R.layout.deliverylist_layout);

    if (getLastNonConfigurationInstance() != null) {
        deliveryIndex = (Integer) getLastNonConfigurationInstance();
    }
    if (PhilpostApplication.DELIVERIES == null) {
        new RetrieveDeliveriesTask().execute();
    } else {
        updateCachedList(PhilpostApplication.DELIVERIES);
    }
}

private void updateCachedList(List<Delivery> deliveries) {
    File expath = context.getFilesDir();
    String apppath = "/databases/DeliveriesDB.sqlite";
    File path = new File(expath, apppath);

    adapter = new DeliveryListAdapter(this,
            R.layout.deliverylist_row_layout, deliveries);
    setListAdapter(adapter);
    PhilpostApplication.DELIVERIES = deliveries;
    Log.d(TAG, "Updating UI list");
    if (PhilpostApplication.firstDb) {
        if (!path.exists()) {
            createBackupDb();
            Log.d(TAG, "DB first Creation");
        }
    }
}

public void createBackupDb() {

    for (int i = 0; i < PhilpostApplication.DELIVERIES.size(); i++) {
        // create db first

        dId = PhilpostApplication.DELIVERIES.get(i).getId();
        rId = PhilpostApplication.DELIVERIES.get(i).getRecipientId();
        lastn = PhilpostApplication.DELIVERIES.get(i).getLastName();
        firstn = PhilpostApplication.DELIVERIES.get(i).getFirstName();
        addr = PhilpostApplication.DELIVERIES.get(i).getAddress();
        dtype = PhilpostApplication.DELIVERIES.get(i).getType();
        amount = PhilpostApplication.DELIVERIES.get(i).getCash();

        pMan = PhilpostApplication.DELIVERIES.get(i).getPostman();
        stats = PhilpostApplication.DELIVERIES.get(i).getStatus();

        createNewDeliveriesDb(dId, rId, lastn, firstn, addr, dtype, amount,
                pMan, stats);
        keyNum[i] = PhilpostApplication.DELIVERIES.get(i).getId();
    }
    Log.d(TAG, "database created");
    PhilpostApplication.firstDb = false;
}
public void logout() {

    if (PhilpostApplication.listSynced == false) {
        // if( checkIfSyncedList() ){
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Sync data first before logging out.")
                .setCancelable(false).setPositiveButton("OK", null);
        final AlertDialog alert = builder.create();
        alert.show();
    } else {

        dialog = ProgressDialog.show(this, "Logging out", "please wait");
        try {
            WebService.logout();
            PhilpostApplication.SESSION_KEY = null; // clear Application
                                                    // Session
            // Key
            AccountStore.clear(this);

            // clear cached list

            PhilpostApplication.DELIVERIES = null;
            MemoryUtils.deleteCache(this);
            PhilpostApplication.incompleteSync = false;
            PhilpostApplication.loggedIn = false;
            PhilpostApplication.firstDb = true;

            DatabaseManager.getInstance().closeDb();
            deleteInternalDb();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (PhilpostApplication.canToggleGPS) {
            turnGpsOff();

        }

        dialog.dismiss();
        exitActivity();
    }
}
    }

Удаление базы данных

    public void deleteInternalDb() {
    File internalDb = new File(
            Environment.getDataDirectory()
                    + "/data/packagename/databases/DeliveriesDB.sqlite");
    if (internalDb.exists()) {
        internalDb.delete();
        Log.d(TAG, "Internal Db deleted");
    }
}
  • 0
    Альтернативным решением для этого было бы создание и доступ к моей базе данных с SD-карты, поэтому мне не придется удалять ее каждый раз, когда пользователь входит в приложение и выходит из него. Но я не знаю как.
Теги:
database
ormlite

2 ответа

0
Лучший ответ

Проверьте пример здесь, это даст вам представление о том, как использовать существующую базу данных.

  • 0
    Я не могу использовать предыдущую базу данных, потому что я уже полностью удалил ее с устройства. Что мне действительно нужно, так это создавать новую базу данных каждый раз, когда пользователь входит в систему. Это потому, что каждый пользователь имеет разные значения внутри базы данных.
  • 0
    Я думаю, что-то не так с вашей структурой базы данных! Вы должны хранить данные в своей базе данных для каждого пользователя.
Показать ещё 1 комментарий
0

когда ваш ответ от db соответствует следующему формату. он работает отлично bcz, я столкнулся с этой проблемой. Мы должны иметь близкий db, в конце блок попробуем это, это может вам помочь.

try
{
   //Query
}
catch
{
}
finally
{
   c.close();
   db.close();
}
  • 0
    мой db.close () работает нормально. У меня проблемы с созданием базы данных обратно. Спасибо за помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню