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

j'essaie 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.

s'il vous Plaît regardez le code ci-dessous et de 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 {

    /** DB Name */
    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();
        }
    }
47
demandé sur clemens 2011-07-22 18:55:19

8 réponses

j'ai aussi 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 appel

 db = getWritableDatabase();

dans le constructeur.

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

j'espère que cela aidera!

55
répondu Kevin King 2017-05-23 12:18:23

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 cette base de données sera créée en mémoire quand vous en avez besoin.:)

22
répondu Jatin Malwal 2013-03-04 22:28:30

j'ai eu un problème similaire où onCreate n'a pas été exécuté. C'est peut-être utile pour quelqu'un, même si c'était un problème différent.

je travaillais sur la base de données avant et avait déjà créé un long temps avant. Donc maintenant après avoir fait des changements dans onCreate () j'espérais trouver les nouvelles tables créées. Mais le SQLiteOpenHelper n'a plus jamais appelé onCreate (). La raison en était que la base de données existait déjà. Je travaille toujours avec le même appareil comme 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 voit qu'une base de données avec 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 était simplement de changer le numéro de version. Donc onUpgrade() a été appelé en offrant des options pour onCreate() change.

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

dans tous les cas, si onCreate() n'est pas appelé, Vérifiez deux fois si la base de données existe. Sinon il n'est pas appelé à nouveau.

3
répondu Tobias Reich 2017-05-21 17:14:17

j'ai eu le même problème.. la résolution pour moi était d'ajouter .db comme extension du nom de base de données

1
répondu HelLViS69 2017-05-19 22:49:20

j'ai eu un problème similaire mais ce n'était pas l'appel OnCreate qui était le problème.

dans l'exemple de code 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 distinctes, 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. Par conséquent, lorsque vous essayez de définir les données du curseur sur un table inexistante, vous invoquerez une exception.

ma solution a été de définir une classe séparée appelée CreateTable qui est appelée à la fois à partir du OnCreate override et du constructeur après le

db = getWritableDatabase();

0
répondu spleen 2016-10-10 19:34:23

dans mon cas, on ne l'appelait pas parce que la base de données existait déjà! Donc, si possible, assurez-vous de supprimer votre application et de l'installer à l'arrière et seulement ensuite vérifier si il est appelé ou non.

0
répondu rsc 2018-03-15 04:55:43

vérifier si le fichier db existe, puis ouvrir l'instance accessible en écriture de la base de données en appelant

dbinstance.getWritableDatabase ()

0
répondu Ahsan Idrees 2018-06-26 13:03:46

vous pouvez changer auto-injection en auto INCREMENT

Note SQLiteOpenHelper a appelé onCreate lorsque la base de données est créée pour la première fois. Si vous créez la table dans la méthode onCreate vous ne pouvez pas créer le nouveau SQLiteDatabase . Vous pouvez voir l'exemple

    @Override
    public void onCreate(SQLiteDatabase db) {
        String stringCreateTable = "CREATE TABLE "+"tblUser"+" ( " +
                "id TEXT PRIMARY KEY, " +
                "name TEXT )";
        db.execSQL(stringCreateTable);
    }
-1
répondu user3313585 2015-10-12 04:32:12