11
votes

SQLITEOPENHELPER - Comment la base de données est-elle créée?

Je fais une demande de base de données et mon programme fonctionne et j'ai compris la majeure partie du tutoriel que j'ai suivi. Cependant, un aspect reste difficile pour moi.

Il y a une classe interne de MyDBhelper s'étendant SQLiteopenhelper. les variables extérieures em> incluent la sqlitedatabase appelée d. Le code de MyDBhelper est le suivant: P>

private static class MyDBHelper extends SQLiteOpenHelper {
        MyDBHelper(Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) {
            Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data.");
            db.execSQL("DROP TABLE IF EXISTS GM");
            onCreate(db);
        }
    }


0 commentaires

7 Réponses :


8
votes

Oncreate () et ONUPGrade () Les méthodes sont vraiment appelées la première fois que DB est créée. En fait, il est coché dans getReDeadableAbase () ou getwritedatabase () méthodes de sqliteopenhelper . Il vérifiera si la DB existe déjà sur le répertoire de données et quelle est sa version. Selon cela, cela appellera oncreate () ou onpgrade () . Ou rien, si le fichier dB existe et de la version correcte.

Vous pouvez rechercher votre code pour exécuter la base de données mydbhelper.gedreadable (inscriptible) () . C'est le moment où cette vérification sera effectuée.

S'il vous plaît laissez-moi savoir si plus de détails sont nécessaires. Bonne chance


0 commentaires

0
votes

Probablement, dans getReeadableDatabase () ou getwrimetaDatabase () quand ils sont appelés pour la première fois



0 commentaires

3
votes

Gardez à l'esprit que vous extensez SQLITEOPENHELER, toute la magie se produit dans cette superbe classe, spécifiquement la base de données est initialement créée (ou simplement rouverte) lorsque vous appelez getreadableAbase () ou GetWRITRABLETTABASE () . Ces deux méthodes:

  • Définissez le SQLITEDATABASE DB VARIABLE (et CONTRÔLE PASSER DB à vos méthodes de rappel)
  • Initialiser dB en appelant votre Oncreate (dB) méthode ou ouvrez la base de données existante
  • Vérifiez le numéro de version et appelez votre ONUPGrade (dB) ou indédowgrade (dB) si nécessaire

    Ils appellent également quelques autres méthodes de rappel tels que Onconfigure (dB) , OnOpen (dB) , etc. ( En savoir plus à propos de ces méthodes.) Si cela vous aidera, vous pouvez lire sur la source Code vous-même pour comprendre la structure de la façon dont tout cela se produit.


0 commentaires

1
votes

La méthode Oncreate () n'est pas un constructeur pour cette classe. Oncrate est appelé lorsque vous créez le dB.

ici PeopleDB étend SQLiteopenhelper. Ce code provient d'une classe différente et oncree est appelé lorsque GetWRITRABLETABASEABASE () ou GETREADABLEDABASEABASE () ou quelque chose du genre est appelé P>

  PeopleDB db = null; //onCreate NOT called here
  db=new PeopleDB(getContext());
  db.getWritableDatabase();  //onCreate is called here!


0 commentaires

1
votes

Voir notre base de données est créée dans le constructeur de OpenHelper lui-même non dans la méthode surCréate remplaçante. À l'intérieur de la méthode OnCreate, nous tirons une requête pour créer une table dans la base de données créée dans le constructeur d'assistant ouvert pour insérer les données qui ne créent pas la base de données.

Une dernière chose est l'objet SQLITEOPENHELPASE n'est pas instancié dans la classe SQLITEOPENHELPER. Il est instancié dans la classe où vous souhaitez utiliser la base de données pour effectuer des opérations de DB et vous devez écrire une fonction comme celle-ci pour supposer ou ouvrir votre base de données pour vous préparer à l'insertion. P>

SQLiteStatement insert_stmt = null;

        try {
            insert_stmt = database.compileStatement(YOUR_QUERY);

            insert_stmt.bindString(1,   field1);
            insert_stmt.bindString(2,   field2);
            insert_stmt.executeInsert();
        }
        finally {
            if (insert_stmt != null) insert_stmt.close();
        }


0 commentaires

0
votes

Vous créez une sous-classe de mise en œuvre surCreate (SQLITEDATABASE), ONUPGrade (SQLITEDATABASE, INT, INT) et éventuellement sur OnOpen (SQLITEDATABASE), et cette classe s'occupe de l'ouverture de la base de données s'il existe, ce qui la crée si elle ne le fait pas et la mise à niveau si nécessaire. (Site Web du développeur Android)


0 commentaires

0
votes

La classe sqliteopenhelper est appelée "Helper" pour une bonne raison. Cela nous permet d'économiser des efforts considérables.

La première fois que vous appelez getwritabledatabase (ou getReeadableAbase ) pour votre implémentation de sqliteopenhelper , votre < Code> Super Dans votre constructeur transmet le contexte actuel et la base de données nom que vous préférez au constructeur Superclass pour sqliteopenhelper .

Le constructeur de Superclass définit ensuite l'espace initial de votre SQLITEDATABASE et l'attribue le nom que vous avez passé via super .

Lorsque vous avez terminé, le constructeur de Superclass appelle Oncreate et transmet le nom de SQLITEDATABASE que celui-ci créé via Oncreate S uniquement paramètre. Étant donné que Oncreate est appelé seulement celui-ci, c'est un très bon endroit pour appeler EXECSQL pour définir la structure de votre base de données.

exécutions suivantes de getReDeadableAtabase (ou getWRITratabase ) ouvre simplement la base de données pour vous et n'appelle plus jamais Oncreate . (Lorsque le constructeur de SuperClass note que Super a envoyé un numéro de version différent, onpgrade est calle.)

Comprendre la manière dont SQLITEOPENHELPER crée une base de données sans code évident et comment le diable oncreate est passé une argument "hors du bleu" était une vraie corvée pour moi. Maintenant, je ne peux pas croire que cela aurait pu être difficile.


0 commentaires