База данных Android воссоздается при каждом запуске приложения - PullRequest
11 голосов
/ 30 июля 2010

Почему 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;</p>

<p>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;</p>

<p>public class DBWrapper {</p>

<p>private static final String DATABASE_NAME = "circles.db";
   private static final int DATABASE_VERSION = 1;
   private static final String[] TABLES = new String[] { "circles"};</p>

<p>private Context context;
   private OpenHelper openHelper;</p>

<p>public DBWrapper(Context context) {
       context.deleteDatabase(DATABASE_NAME);
      this.context = context;
      this.openHelper = new OpenHelper(this.context);
   }</p>

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

<p>public void clearCircles()
   {
       String sql = "delete * from circles";
       Log.i("DBWrapper::clearCircles()", "Executing sql: " + sql);
       openHelper.getWritableDatabase().execSQL(sql);
   }</p>

<p>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 {</p>

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

}}

Ответы [ 4 ]

12 голосов
/ 30 июля 2010

Посмотрите на ваш конструктор DBWrapper,

вы звоните

context.deleteDatabase(DATABASE_NAME);

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

1 голос
/ 02 августа 2010

Надеемся, что приведенная ниже ссылка поможет.

stackoverflow.com -> Запрос о существовании Adroid DB!

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

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

content.deleteDabase(DATABASE_NAME)

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

0 голосов
/ 16 марта 2018

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

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

CREATE TABLE, если не существует TABLE_NAME (ключ data_type);

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

0 голосов
/ 30 июля 2010

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

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

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