Nous avons une base de données sqlite dans notre application. Son bon fonctionnement pour tous les utilisateurs, mais peu d'entre eux rencontrant l'erreur Caused by: Android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
.
Ci-dessous, ma classe d'assistance sqlite pour créer la base de données et le journal des erreurs. Dans assert/Master.db
nous avons la table generalSettings
. Mais après l'avoir copiée sur l'appareil, la table est manquante. Cela ne se produit que pour quelques utilisateurs. J'ai cherché la solution mais je ne trouve pas l'exacte. Équipe s'il vous plaît aidez-moi à résoudre ce problème.
Code:
import Java.io.FileOutputStream;
import Java.io.InputStream;
import Java.io.OutputStream;
import Java.io.PrintWriter;
import Java.io.StringWriter;
import Android.content.Context;
import Android.content.Intent;
import Android.database.sqlite.SQLiteDatabase;
import Android.database.sqlite.SQLiteOpenHelper;
import Android.net.Uri;
import Android.util.Log;
public class InstallDB extends SQLiteOpenHelper {
Context ctx;
String DBNAME;
String DBPATH;
Modules modObj = new Modules();
public InstallDB(Context context, String name) {
super(context, name, null, 1);
this.ctx = context;
this.DBNAME = name;
this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath();
Log.e("Path 1", DBPATH);
}
public void createDataBase() {
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if (!dbExist) {
synchronized (this) {
db_Read = this.getReadableDatabase();
Log.e("Path 2", this.getReadableDatabase().getPath());
db_Read.close();
copyDataBase();
Log.v("copyDataBase---", "Successfully");
}
// try {
// } catch (IOException e) {
// throw new Error("Error copying database");
// }
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DBPATH;
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
} catch (Exception e) {
Log.i("SQLite Error", "database does't exist yet.");
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() {
try {
InputStream myInput = ctx.getAssets().open(DBNAME);
String outFileName = DBPATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024 * 3];
int length = 0;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
} catch (Exception e) {
Modules.stacTaceElement = e.getStackTrace();
StringWriter stackTrace1 = new StringWriter();
e.printStackTrace(new PrintWriter(stackTrace1));
System.err.println(stackTrace1);
Intent send = new Intent(Intent.ACTION_SENDTO);
String uriText;
uriText = "mailto:[email protected]"
+ "&subject=Error Report"
+ "&body="
+ stackTrace1.toString();
uriText = uriText.replace(" ", "%20");
Uri uri = Uri.parse(uriText);
send.setData(uri);
ctx.startActivity(Intent.createChooser(send, "Send mail..."));
// TODO: handle exception
}
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Journal des erreurs:
Java.lang.RuntimeException: Unable to start activity ComponentInfo{palmagent.FidelityAgent.Two/palmagent.FidelityAgent.Two.PassNew}: Android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2209)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2269)
at Android.app.ActivityThread.access$800(ActivityThread.Java:139)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1210)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5102)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:785)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings
at Android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at Android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.Java:889)
at Android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.Java:500)
at Android.database.sqlite.SQLiteSession.prepare(SQLiteSession.Java:588)
at Android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.Java:58)
at Android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.Java:37)
at Android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.Java:44)
at Android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.Java:1314)
at Android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.Java:1253)
at palmagent.FidelityAgent.Two.masterDatabase.selectquery(masterDatabase.Java:59)
at palmagent.FidelityAgent.Two.Modules.checkDatabase(Modules.Java:28825)
at palmagent.FidelityAgent.Two.PassNew$LoaduserDetails.onPreExecute(PassNew.Java:140)
at Android.os.AsyncTask.executeOnExecutor(AsyncTask.Java:587)
at Android.os.AsyncTask.execute(AsyncTask.Java:535)
at palmagent.FidelityAgent.Two.PassNew.onCreate(PassNew.Java:120)
at Android.app.Activity.performCreate(Activity.Java:5248)
at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1110)
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2173)
... 11 more
Le problème vient du fait que certains appareils mettent à niveau votre application. Le checkDataBase()
retournant true
vous évite donc d'appeler copyDataBase()
. Donc, vous utilisez la base de données précédente qui n’a pas la table generalSettings
. Pour résoudre cet essai:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(newVersion>oldVersion)
copyDatabase();
}
et mettez également à jour votre constructeur:
public InstallDB(Context context, String name) {
super(context, name, null, DB_VERSION);
// DB_VERSION is an int,update it every new build
this.ctx = context;
this.DBNAME = name;
this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath();
Log.e("Path 1", DBPATH);
}
Après avoir passé quelques heures, j'ai eu cette solution:
1) Paramètres> Gestionnaire d'applications
2) Sélectionnez App
3) Effacer les données
4) désinstaller l'application
Maintenant, lancez l'application depuis Android Studio
J'espère que cela fonctionne correctement
Une autre solution possible consiste à désinstaller une application de l'émulateur Android et à l'exécuter à nouveau.
Si vous souhaitez simplement supprimer une application:
1.Start the emulator. 2.Open the Android settings app. 3.Select "Applications" (Called "Apps" on Android 4.0 or higher) 4.Select "Manage Applications" (Only on Android 3.2 or lower) 5.Select the application you want to uninstall. 6.Click "Uninstall"
Cette erreur se produit car vous n'utilisez pas DATABASE_VERSION
public class DatabaseHelper extends SQLiteOpenHelper {
private static SQLiteDatabase sqliteDb;
private static DatabaseHelper instance;
private static final int DATABASE_VERSION = 1;
Augmentez votre version chaque fois que vous apportez des modifications à votre base de données, augmentez simplement DATABASE_VERSION avec +1.
c'est une exception de mise à niveau. Assurez-vous d'avoir la table dans votre base de données précédente. Sinon, créez-le. PS: si vous venez de créer cette application, désinstallez-la de votre émulateur ou de votre appareil, puis réinstallez-la. Mais ce n'est pas recommandé car les données ne seront pas perdues.
1.Changez votre version de la base de données ou Commencez par désinstaller vos applications dans l'émulateur ou le téléphone, puis réinstallez-le .
Supposons que si vous exécutez votre application avec la version 1 de la base de données, si vous modifiez la structure de la table ou ajoutez une nouvelle table, vous devez augmenter la version de la base de données à 2 et plus si vous apportez d'autres modifications.
public class AppDatabase extends SQLiteOpenHelper {
// Database Name
private static final String DATABASE_NAME = "myDatabase";
// Database Version
private static final int DATABASE_VERSION = 1;
public AppDatabase(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
Augmentez cette valeur DATABASE_VERSION si des modifications sont apportées.
Même si vous avez codé pour quelques tables et mis à niveau la base de données, votre application va se bloquer. Ce que vous devez faire est que pour chaque table, créez des modifications de base de données, mettez à niveau le DATABASE_VERSION
Si vous avez peu de classes DatabaseHelper ( read this ), vous devez ajouter cette méthode à votre aide de base de données:
@Override
public void onOpen(SQLiteDatabase db) {
onCreate(db);
}
Si vous utilisez GreenDao et obtenez cette erreur, assurez-vous de désinstaller l'application et essayez à nouveau. Cela a résolu mon problème