База данных Android воссоздается при каждом запуске приложения

Почему SQLiteOpenHelper вызывает onCreate () каждый раз, когда мое приложение запускается. Вот мой код для 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");
  }

у меня есть внешний класс вокруг моего расширенного класса SQLiteOpenHelper, и когда я запрашиваю, я делаю это:

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

и пропускает этот блок из-за этого оператора if

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

вот весь мой класс оболочки базы данных:

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

} }

4 ответов


посмотрите на свой конструктор DBWrapper,

ты называешь

context.deleteDatabase(DATABASE_NAME);

этого удалить файл базы данных каждый раз, когда вы называете его. Принуждение SQLHelper к воссозданию базы данных.


ссылка ниже, надеюсь, поможет.

stackoverflow.com - > запрос, если Adroid DB существует!

надеюсь, что это поможет

плакат выше также упоминалось, что вы удаляете базу данных

content.deleteDabase(DATABASE_NAME)

в вас конструктор DBWrapper ()


попробуйте это :

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

}

Если вы хотите создать один раз базу данных при первом запуске приложения, вам нужно изменить этот запрос.

вам нужно проверить базу данных уже существует или нет, если нет, чем создать базу данных еще не создать базу данных.

создать таблицу, если не существует TABLE_NAME (key data_type);

вызовите этот запрос внутри метода onCreate.