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);
}
}
7 Réponses :
Vous pouvez rechercher votre code pour exécuter la base de données S'il vous plaît laissez-moi savoir si plus de détails sont nécessaires. Bonne chance p> Oncreate () code> et ONUPGrade () code> 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 () code> méthodes de sqliteopenhelper code>. 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 () code>. Ou rien, si le fichier dB existe et de la version correcte. P>
mydbhelper.gedreadable (inscriptible) () code>. C'est le moment où cette vérification sera effectuée. P>
Probablement, dans getReeadableDatabase () code> ou getwrimetaDatabase () code> quand ils sont appelés pour la première fois p>
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 Ils appellent également quelques autres méthodes de rappel tels que getreadableAbase () code> ou GetWRITRABLETTABASE () CODE>. Ces deux méthodes: p>
SQLITEDATABASE DB CODE> VARIABLE (et CONTRÔLE PASSER DB CODE> à vos méthodes de rappel) LI>
dB code> en appelant votre Oncreate (dB) code> méthode ou ouvrez la base de données existante li>
ONUPGrade (dB) code> ou indédowgrade (dB) code> si nécessaire li>
ul>
Onconfigure (dB) code>, OnOpen (dB) code>, 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. P>
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!
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();
}
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) P>
La classe La première fois forte> forte> que vous appelez Le constructeur de Superclass définit ensuite l'espace initial de votre Lorsque vous avez terminé, le constructeur de Superclass appelle exécutions suivantes de Comprendre la manière dont sqliteopenhelper code> est appelée "Helper" pour une bonne raison. Cela nous permet d'économiser des efforts considérables. P>
getwritabledatabase code> (ou getReeadableAbase code>) pour votre implémentation de sqliteopenhelper code>, votre < Code> Super code> Dans votre constructeur transmet le contexte actuel code> et la base de données nom code> que vous préférez au constructeur Superclass pour sqliteopenhelper code>. p>
SQLITEDATABASE CODE> et l'attribue le nom que vous avez passé via super code>. p>
Oncreate code> et transmet le nom de SQLITEDATABASE CODE> que celui-ci créé via Oncreate code> S uniquement paramètre. Étant donné que Oncreate code> est appelé seulement celui-ci, c'est un très bon endroit pour appeler EXECSQL code> pour définir la structure de votre base de données. P>
getReDeadableAtabase code> (ou getWRITratabase code>) ouvre simplement la base de données pour vous et n'appelle plus jamais Oncreate code>. (Lorsque le constructeur de SuperClass note que Super code> a envoyé un numéro de version différent, onpgrade code> est calle.) P>
SQLITEOPENHELPER CODE> crée une base de données sans code évident et comment le diable oncreate code> 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. P>