SQLiteOpenHelper не удалось вызвать onCreate? - PullRequest
28 голосов
/ 17 февраля 2011

Я пытаюсь создать локальную базу данных на телефоне Android с помощью sqlite.

У меня есть вспомогательный класс, показанный ниже, который используется для создания базы данных и предоставления «справки».

Я хочу создать объект этого класса в основной части моего кода, а также создать базу данных и таблицы там.

Проблема:

Всякий раз, когда я создаю объект класса, кажется, что он не вызывает метод onCreate в помощнике.Я думал, что это должно произойти.Я думал, что onCreate был в основном конструктором для класса.(Я считаю, что я не прав)

  • Итак, почему он не вызывает метод onCreate?
  • Или как мне получить его для создания базы данных и таблиц, в которых я создаю объект класса?
  • Что может быть лучше для этого, если это не очень хороший подход?

public class SmartDBHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "smart_lite_db.db";
    private static final int DATABASE_VERSION = 2;
    private static final String NOTIFY_TABLE_NAME = "user_notify_data";
    private static final String HR_TABLE_NAME = "user_hr_data";
    private static final String NOTIFY_TABLE_CREATE = 
        "CREATE TABLE " + NOTIFY_TABLE_NAME + 
        " (counter INTEGER PRIMARY KEY, " + 
        "userresponse INTEGER, " + 
        "notifytime INTEGER);";
    private static final String DATA_TABLE_CREATE = 
        "CREATE TABLE " + HR_TABLE_NAME +
        " (counter INTEGER PRIMARY KEY, " +
        "hr INTEGER, " +
        "act INTEGER, " +
        "timestamp INTEGER);";      

    public SmartDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        Log.v("smartdbhelper", "before creation");
        db.execSQL(NOTIFY_TABLE_CREATE);
        Log.v("smartdbhelper", "middle creation");
        db.execSQL(DATA_TABLE_CREATE);
        Log.v("smartdbhelper", "after creation");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) {
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
   }
}

Ответы [ 3 ]

67 голосов
/ 17 февраля 2011

onCreate не является конструктором для класса базы данных. Он вызывается только если вы пытаетесь открыть базу данных, которая не существует. Чтобы открыть / создать базу данных, вам нужно добавить вызов к одному из следующих методов:

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) {
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
      // open to read and write
      dBHelper.getWritableDatabase();
      // or to read only
      // dBHelper.getReadableDatabase();
   }
}

Он немного большой, но вот мой DatabaseAdapter, на который вы можете посмотреть: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java

14 голосов
/ 17 февраля 2011

Вам нужно позвонить getWritableDatabase() или getReadableDatabase().

1 голос
/ 14 сентября 2018

oncreate () метод не является конструктором и также вызывается при первом создании базы данных. Так что вам нужно вызвать getWritableDatabase () или getReadableDatabase ( ) для открытия или создания в вашей базе данных.

getReadableDatabase (): - Создать и / или открыть базу данных.

getWritableDatabase (): - создать и / или открыть базу данных, которая будет используется для чтения и письма.

...