web-dev-qa-db-fra.com

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

J'essaie de créer 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é alors que j'essayais de déboguer. 

S'il vous plaît regardez le code ci-dessous et me donner des suggestions. Toute aide serait 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();
        }
    }
49
zono

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

SQLiteDatabase db;

Dans la sous-classe SQLiteOpenHelper et appelant

 db = getWritableDatabase();

dans le constructeur.

La réponse à cette question comprend également des informations utiles: SQLiteOpenHelper n'a pas pu appeler onCreate?

J'espère que ça aide!

56
Kevin King

Tant que vous n’appelez pas 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 aurez réellement besoin. :)

23
Jatin Malwal

J'ai eu un problème similaire où onCreate n'a pas été exécuté. Peut-être est-ce utile pour quelqu'un même s’il s’est avéré qu’il s’agit d’un problème différent. 

Je travaillais sur la base de données auparavant et j'avais déjà créé longtemps auparavant. Alors maintenant, après avoir apporté des modifications à onCreate (), j'espérais trouver les nouvelles tables créées. Mais SQLiteOpenHelper n'a jamais appelé onCreate () à nouveau. La raison en était, 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 (ancienne) déjà existante.

Mais il y a de l'espoir. Lorsque le système constate 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 consistait simplement à changer le numéro de version. OnUpgrade () a donc été appelé offrant des options pour les modifications de onCreate (). 

Donc, les options étaient soit de désinstaller l’application complète (et avec elle la base de données), soit d’appeler à nouveau onCreate après la mise à niveau du numéro de version (et, par exemple, supprimer) l’ancienne table et d’appeler à nouveau onCreate (). 

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

5
Tobias Reich

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

1
HelLViS69

Vérifiez si le fichier db existe, puis ouvrez l'instance de la base de données en écriture en appelant 

dbinstance.getWritableDatabase ()

0
Ahsan Idrees

Dans mon cas, il n’était pas appelé car la base de données existait déjà! Donc, si possible, assurez-vous de supprimer votre application, de la réinstaller et de vérifier ensuite si elle est appelée ou non.

0
rsc