web-dev-qa-db-fra.com

SQLiteOpenHelper n'a pas pu appeler onCreate?

J'essaie de créer une base de données locale sur un téléphone Android à l'aide de sqlite.

J'ai une classe d'assistance, illustrée ci-dessous, qui est utilisée pour créer la base de données et fournir l'aide. 

Je veux créer un objet de cette classe dans la partie principale de mon code et y créer la base de données et les tables.

Le problème:

Chaque fois que je crée un objet de la classe, il ne semble pas appeler la méthode onCreate dans l'aide. Je pensais que c'est supposé arriver. Je pensais que onCreate était fondamentalement un constructeur pour la classe. (Je crois que je me trompe) 

  • Alors, pourquoi n'appelle-t-il pas la méthode onCreate
  • Ou comment puis-je l'obtenir pour créer la base de données et les tables où je crée l'objet de la classe? 
  • Quelle serait la meilleure façon de procéder si ce n’était pas une bonne approche?

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());
   }
}
28
prolink007

onCreate n'est pas un constructeur pour la classe de base de données. Il est appelé uniquement si vous essayez d'ouvrir une base de données qui n'existe pas . Pour ouvrir/créer la base de données, vous devez ajouter un appel à l'une de ces méthodes:

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();
   }
}

C'est un peu gros, mais voici mon DatabaseAdapter, vous pouvez consulter: http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.Java

67
WarrenFaith

Vous devez appeler getWritableDatabase() ou getReadableDatabase().

14
gngr44

La méthode oncreate () n'est pas un constructeur et est également appelée lorsque la base de données est créée pour la première fois.Vous devez donc appeler getWritableDatabase () ou getReadableDatabase () pour ouvrir ou créer vers votre base de données.

getReadableDatabase (): - Créez et/ou ouvrez une base de données. 

getWritableDatabase (): - Créez et/ou ouvrez une base de données qui sera utilisé pour la lecture et l'écriture.

1
Yohan Malshika