60 votes

Android SQLiteOpenHelper: Pourquoi la méthode onCreate() n'est pas appelée?

Je suis en train de faire ma première application Android. J'ai remarqué que la méthode SQLiteOpenHelper.onCreate() n'est pas appelée pour créer des tables si la base de données n'existe pas. Cependant, la méthode onCreate() n'a pas fonctionné même si j'ai essayé de déboguer.

Veuillez regarder le code ci-dessous et me donner des suggestions. Toute aide sera appréciée.

public class NameToPinyinActivity extends Activity {

    DatabaseOpenHelper helper = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nametopinyin);

        Button searchButton = (Button) findViewById(R.id.search);
        searchButton.setOnClickListener(new ButtonClickListener());

        helper = new DatabaseOpenHelper(NameToPinyinActivity.this);
    }

public class DatabaseOpenHelper extends SQLiteOpenHelper {

    /** Nom de la base de données */
    private static final String DB_NAME = "pinyin";

    /** CREATE TABLE SQL */
    private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN"
            + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)";

    public DatabaseOpenHelper(Context context) {
        super(context, DB_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.beginTransaction();
        try {
            db.execSQL(CREATE_TABLE_SQL);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }

0 votes

Avez-vous essayé de mettre un log pour voir? Comment êtes-vous sûr que le onCreate() est appelé? Si vous définissez des points d'arrêt, ils n'atteignent généralement pas cette méthode dans le DB helper, d'après mon observation.

66voto

Kevin King Points 956

J'ai également eu des problèmes avec le SQLiteOpenHelper. Ce qui a fonctionné pour moi était de stocker une variable membre

SQLiteDatabase db;

dans la sous-classe SQLiteOpenHelper et d'appeler

 db = getWritableDatabase();

dans le constructeur.

La réponse à cette question inclut également des informations utiles: SQLiteOpenHelper failing to call onCreate?

J'espère que cela vous aidera!

0 votes

Oui! tu as raison! Je pourrais faire la base de données et la référence que tu as mentionnée est très utile. Merci!

1 votes

Db = getWritableDatabase(); - pour moi, cela déclenche uniquement onUpgrade, mais pas onCreate. Des indices ?

8 votes

Cela signifie que la base de données est déjà créée. Seulement si la base de données n'existe pas, onCreate() sera appelé.

27voto

Jatin Malwal Points 1077

Jusqu'à ce que vous appeliez la méthode getWritableDatabase() ou getReadableDatabase() de la classe SQLiteOpenHelper, la base de données ne sera pas créée.

Aussi simple que cela, la base de données sera créée en mémoire lorsque vous en aurez réellement besoin. :)

6voto

Tobias Reich Points 1188

J'ai eu un problème similaire où onCreate n'a pas été exécuté. Peut-être que cela sera utile pour quelqu'un même si cela s'est révélé être un problème différent.

Je travaillais sur la base de données auparavant et j'avais déjà créé une depuis longtemps. Donc maintenant, après avoir apporté des modifications dans onCreate(), j'espérais trouver les nouvelles tables créées. Mais SQLiteOpenHelper n'a jamais appelé à nouveau onCreate(). La raison était que la base de données existait déjà. Je travaillais toujours avec le même appareil qu'auparavant et par conséquent avec la base de données déjà existante (ancienne).

Mais il y a de l'espoir. Lorsque le système détecte qu'une base de données portant ce nom existe déjà, il vérifie également si le numéro de version est correct. Dans ce cas, j'ai simplement oublié que la base de données existait déjà. Ma solution a été simplement de changer le numéro de version. Ainsi, onUpgrade() a été appelé offrant des options pour les changements onCreate().

Donc les options étaient soit désinstaller l'application complète (et avec elle la base de données) soit appeler onCreate à nouveau après avoir mis à jour le numéro de version (et par exemple supprimer) l'ancienne table et appeler onCreate() à nouveau.

En tout cas, si onCreate() n'est pas appelé, vérifiez deux fois si la base de données existe. Sinon, il ne sera pas rappelé.

1voto

spleen Points 11

J'ai rencontré un problème similaire cependant ce n'était pas l'appel de OnCreate qui posait souci.

Dans le code d'exemple ci-dessus, Kevin a expliqué que le OnCreate n'est pas appelé si la base de données existe déjà. Cependant, si, comme moi, vous utilisez plusieurs tables provenant d'activités séparées, alors même si vous avez déjà créé la base de données, la table associée à cette activité n'a peut-être pas encore été créée. Ainsi, lorsque vous essayez de définir les données du curseur sur une table qui n'existe pas, vous provoquerez une exception.

Ma solution a été de définir une classe séparée appelée CreateTable qui est appelée à la fois depuis le remplacement de OnCreate et depuis le constructeur après le

db = getWritableDatabase();

1voto

J'avais un problème similaire avec onCreate() ne s'exécutant pas lorsque l'application était lancée pour la toute première fois, donc ma base de données n'était jamais créée. Ce n'est PAS la même chose que lorsque onCreate() ne s'exécute pas parce que la base de données existait déjà, car la base de données n'existait pas encore. Plus précisément, mon DataProvider onCreate() ne s'exécutait pas, donc le OpenHelper non plus.

J'ai vérifié que j'avais tout configuré de la manière dont tout le monde le décrivait dans les réponses précédentes, mais rien n'a résolu mon problème. Je publie cette réponse au cas où quelqu'un d'autre oublierait un petit détail comme je l'ai fait.

Ce qui a résolu le problème pour moi a été d'ajouter une entrée dans AndroidManifest.xml pour mon fournisseur de données, imbriquée dans les balises, ainsi que toutes mes entrées . Les seuls attributs dont j'avais besoin étaient:

  • android:name=".DataManagement.DbDataProvider"
  • android:authorities="com.example.myApplicationName.DataManagement.DbDataProvider"
  • android:exported="false"

(Assurez-vous de modifier les valeurs pour les attributs ci-dessus pour correspondre à votre projet)

J'ai nettoyé, construit, exécuté, et les méthodes onCreate() pour les classes du fournisseur de données et du open helper se sont exécutées correctement, et la base de données a été créée lors du premier lancement de l'application!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X