Pourquoi SQLiteOpenHelper appelle onCreate() chaque fois que mon application démarre. Voici mon code pour onCreate()La base de données Android recrée chaque fois que l'application est lancée
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("onCreate()", "Enter");
//create cards table
db.execSQL(
"create table circles" +
"("+
"id integer primary key,"+
"x integer not null," +
"y integer not null"+
")"
);
Log.i("onCreate()", "Exit");
}
J'ai une classe en dehors autour de ma classe SQLiteOpenHelper étendu, et quand je fais une recherche, je fais ceci:
Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null);
et saute ce bloc en raison de cette instruction if
if (cursor.moveToFirst()) {...}
Voilà toute ma classe wrapper de base de données:
package db.main;import java.util.ArrayList; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import testing.main.Circle;
public class DBWrapper {
private static final String DATABASE_NAME = "circles.db"; private static final int DATABASE_VERSION = 1; private static final String[] TABLES = new String[] { "circles"};
private Context context; private OpenHelper openHelper;
public DBWrapper(Context context) { context.deleteDatabase(DATABASE_NAME); this.context = context; this.openHelper = new OpenHelper(this.context); }
public void insertCircle(Circle c) { String sql = "insert into circles (x, y) values (" + c.getX() + ", " + c.getY() + ")"; Log.i("DBWrapper::insertCircle()", "Executing sql: " + sql); openHelper.getWritableDatabase().execSQL(sql); }
public void clearCircles() { String sql = "delete * from circles"; Log.i("DBWrapper::clearCircles()", "Executing sql: " + sql); openHelper.getWritableDatabase().execSQL(sql); }
public ArrayList getCircles() { ArrayList circles = new ArrayList(); Cursor cursor = openHelper.getWritableDatabase().query(TABLES[0], null, null, null, null, null, null); //Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null); Log.i("DBWrapper::getCircles()", "move to first1"); if (cursor.moveToFirst()) { Log.i("DBWrapper::getCircles()", "move to first"); do { Log.i("DBWrapper::getCircles()", "Creating circle: " + cursor.getString(1) + ", " + cursor.getString(2)); circles.add(new Circle(Integer.parseInt(cursor.getString(1)), Integer.parseInt(cursor.getString(2)))); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return circles; } private static class OpenHelper extends SQLiteOpenHelper {
OpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { Log.i("OpenHelper::onCreate()", "Enter"); //create cards table db.execSQL( "create table circles" + "("+ "id integer primary key,"+ "x integer not null," + "y integer not null"+ ")" ); Log.i("OpenHelper::onCreate()", "Exit"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("Example", "Upgrading database, this will drop tables and recreate."); for(String s: TABLES) { db.execSQL("DROP TABLE IF EXISTS " + s); } onCreate(db); }
}}
Permettez-moi de savoir si je dois poster plus de code ou quoi que ce soit. Merci.
Hmmm. Testez-vous sur un émulateur? Si c'est le cas, vous devriez peut-être vérifier que vous n'essuyez pas les données utilisateur de l'émulateur avant de le démarrer. – Hamy
Non, je suis en train de tester sur un périphérique – wangburger
Peut-être que vous pouvez publier l'ensemble de votre corps de code de base de données? Je ne vois pas le problème dans ce que vous avez ici:/ – Hamy