La base de données Sqlite onUpgrade() n'est pas appelé
Je suis en train de travailler sur une application android où j'ai utilisé la base de données sqlite dans le dossier actif. Donc j'ai fait copier la base de données à partir de ce dossier. L'utilisateur peut également enregistrer leurs propres données(marque tout contenu que favori).
J'ai téléchargé une version sur le marché. Maintenant, je veux ajouter de nouvelles données dans la base de données et mis en ligne une nouvelle version. Si l'utilisateur mise à jour de l'application sur le marché, je veux garder les données de l'utilisateur(à partir de la version précédente) et ajouter les nouvelles données ainsi. J'ai fait un peu de google et a trouvé que sur la méthode de mise à niveau devrait faire l'affaire. Mais je suis l'évolution du DATABASE_VERSION de code, mais la méthode de mise à niveau n'a pas obtenir de l'appel. Je me demandais, j'ai raté quelque chose. Voici mon code:
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/riskycoder.login/databases/";
public static String DB_NAME = "datenbank_EN.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static final int DATABASE_VERSION = 1;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
} else {
this.getWritableDatabase();
try {
this.close();
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
}
if (checkDB != null)
checkDB.close();
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[2048];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
//myDataBase.setVersion(DATABASE_VERSION);
}
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
Log.d("Test", "Database version: " +myDataBase.getVersion());
}
@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion);
}
}
- Je suis l'évolution du DATABASE_VERSION de code.., exactement ce que cela veut dire? Je vois que vous appelez la super constructeur de la
SQLiteOpenHelper
avec un champ constantDATABASE_VERSION
(qui, évidemment, ne peut pas être changé), alors comment voulez-vous changer la version de base de données? - Dans la nouvelle version de l'application, j'ai changé le DATABASE_VERSION à 2. Donc, lors de l'installation de la nouvelle version de la onUpgrade méthode doit être appelée. Ou il me manque quelque chose?
- D'abord, le code que vous avez posté showa DATABASE_VERSION est 1, donc onUpgrade ne serait pas appelé. Deuxièmement, même si elle a été de 2, votre onUpgrade a pas de code pour faire anythign pour mettre à jour la base de données. Il ne se produit pas automatiquement, vous devez le faire.
- Je suis face à un même problème avez-vous capable de résoudre ce problème.
- quelqu'un peut s'il vous plaît aider moi je suis aussi face à la difficulté de mettre à niveau la base de données des actifs dossier
Vous devez vous connecter pour publier un commentaire.
onUpgrade()
n'est appelée que si un changement dans la base de données numéro de version est détectée. Incrémenter la version de base de données comme suit:onUpgrade
méthode appelée." Bien sûr, il ne crache un message de journal qu'il n'a pas encore mis en œuvreonUpgrade
.onUpgrade
est appelée que LORSQUE votre application détecte un changement dans laDATABASE_VERSION
nombre. Ainsi, simplement incrémenter le numéro de version sera la cause deonUpgrade
être appelé qu'une seule fois et il ne sera pas appelé à nouveau jusqu'à ce que le numéro de version est de nouveau changé (c'est à dire en incrémentant le numéro à 3).Changer votre onUpgrade à la suite de
Et également modifier votre createDataBase() comme ci-dessous,
À la fin d'augmenter votre base de données de la version et de l'exécuter à nouveau.
onUpgrade
n'est pas appelée jusqu'à ce que vous appelezgetReadableDatabase()
ou des fonctions similaires.Espère que cette aide
Essayez ceci (augmentation de la DATABASE_VERSION) & la onUpdate() sera appelée:
En supposant que vous avez modifié le DATABASE_VERSION, vous avez encore de mettre le code dans le onUpgrade pour y arriver. Ce n'est pas magique, vous avez à lui dire quoi faire.
Dans votre cas, vous avez besoin de:
1) copie de l'ancienne base de données (lui donner un nouveau nom)
2) copier dans votre nouvelle base de données
3) lire les données de l'ancienne base de données
4) copie de toutes les différences dans la nouvelle base de données
5) supprimer l'ancienne base de données
MODIFIER
En supposant que vous expédier la DB dans les actifs dossier que vous souhaitez copier pour un usage comme suit: