Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android database recreates every time application is launched

Tags:

android

sqlite

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<Circle> getCircles() {
       ArrayList<Circle> circles = new ArrayList<Circle>();
       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);
      }
   }
}
like image 918
wangburger Avatar asked Jul 29 '10 20:07

wangburger


1 Answers

Try this :

public class DataBaseHelper extends SQLiteOpenHelper {
    private static final String DATENBANK_NAME = "yourdatabase.db";
    private static final int DATENBANK_VERSION = 1;

    public DataBaseHelper(Context context) {
        super(context, DATENBANK_NAME, null, DATENBANK_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(PartialTripTbl.SQL_CREATE);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + PartialTripTbl.TABLE_NAME);
        onCreate(db);
    }

}
like image 146
fmo Avatar answered Nov 15 '22 18:11

fmo