Monday, 7 November 2016

sqlite - Android database recreates every time application is launched



Why is SQLiteOpenHelper calling onCreate() every time my application starts up. Here's my code for onCreate()



@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");
}


I have an outside class around my extended SQLiteOpenHelper class, and when I query, I do this:



Cursor cursor = openHelper.getWritableDatabase().rawQuery("select * from circles", null); 



and skips this block because of this if statement



if (cursor.moveToFirst()) {...}


Here's my entire Database wrapper class:




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);
}



}
}




Answer



Look at your DBWrapper constructor,



you're calling




context.deleteDatabase(DATABASE_NAME);



This will delete the database file every time you call it. Forcing the SQLHelper to recreate the database.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...