Android SQLite Где и когда инициализировать SQLiteOpenHelper - PullRequest
5 голосов
/ 13 мая 2011

Я действительно борюсь с использованием SqlLite в моем приложении;

Я установил вспомогательный класс базы данных, который расширяется от SQLiteOpenHelper

public class DatabaseHelper extends SQLiteOpenHelper {

В OnCreate я создаю около 6 таблиц:

public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , "
            + "info TEXT," + 
            + "TopLeft TEXT")); <-- example insert

}

Когда мое приложение запускается, я анализирую некоторые xml и вводю данные в таблицу, проверил базу данных, все там, и мои таблицы созданы правильно.

Когда я иду, чтобы вызвать данные, они ушли! У меня много разных запросов в моем классе dbhelper и по каждому виду деятельности, который я инициализирую, чтобы я мог получить доступ к своей функции в классе.

Я предполагаю, что это не способ сделать это, так как он снова запускает мое создание и стирает все мои таблицы (или, по крайней мере, так происходит, когда он работает, когда я проверяю БД после того, как попытался вызвать из нее данные) и пусто!

У меня сложилось впечатление, что oncreate запускался только один раз, но это, очевидно, не тот случай, так как кажется, что он каждый раз воссоздает мою БД и стирает мои данные!

Где вы должны инициализировать класс dbhelper и как остановить его, воссоздавая таблицы? Мне нужно, чтобы данные сохранялись даже после закрытия приложения!

Я в замешательстве!

Если это не имеет смысла, пожалуйста, задавайте конкретные вопросы о том, как я могу это уточнить!

UPDATE

Я нашел, что могу добавить

CREATE TABLE IF NOT EXISTS

Что останавливает воссоздание таблиц, но все равно кажется неправильным каждый раз вызывать oncreate ..

Ответы [ 4 ]

2 голосов
/ 17 мая 2011

Вы могли бы поместить класс обертки вокруг него?

public class DbAdapter
{

  // database details
  private static final String DATABASE_NAME = "dbname";
  private static final int DATABASE_VERSION = 1;

  // where we're running
  private final Context mCtx;

  private static class DatabaseHelper extends SQLiteOpenHelper
  {
    DatabaseHelper(Context context)
    {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
      // your initial database create statements go here
      db.execSQL(DATABASE_CREATE);
    }

    // if you need to recreate the database, you just up the version number
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
      // drop commands for each table goes here
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
      onCreate(db);
    }
  }

  public DbAdapter(Context ctx)
  {
    this.mCtx = ctx;
  }

  public DbAdapter open() throws SQLException
  {
    mDbHelper = new DatabaseHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
    return this;
  }

  public void close()
  {
    mDbHelper.close();
  }

  // other database methods can go here
}
1 голос
/ 13 мая 2011

onCreate () метод вызывается только при первой попытке доступа к вашей базе данных, но он не создан.Так что onCreate() будет вызываться только один раз. getWritableDatabase возвращает объект БД и при необходимости вызовет onCreate(). NotePadProvider дает хороший пример использования SQLiteOpenHelper.

0 голосов
/ 27 февраля 2016

Код инициализации БД должен идти в методе onCreate вашего Помощника.С андроида SQLiteOpenHelper javadocs:

/**
 * Called when the database is created for the first time. This is where the
 * creation of tables and the initial population of the tables should happen.
 *
 * @param db The database.
 */
public abstract void onCreate(SQLiteDatabase db);
0 голосов
/ 13 мая 2011

Я не уверен, что вы подразумеваете под выражением -

"каждое действие я; я инициализирую класс, чтобы я мог получить доступ к своей функции в классе."

В каждомдействие, при котором вам необходим доступ к базе данных, все, что вам нужно сделать, это открыть базу данных, получить доступ / обновить данные в таблицах и закрыть обработчик.

Вы видели этот простой пример приложения NotePad -

Пример приложения NotePad от Google

Может быть, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...