为什么每次我的应用程序启动时,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()) {...}

这是我的整个数据库包装器类:

软件包db.main;

导入java.util.ArrayList;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入testing.main.Circle;

公共(public)类DBWrapper {

私有(private)静态最终字符串DATABASE_NAME =“circles.db”;
私有(private)静态最终int DATABASE_VERSION = 1;
私有(private)静态最终String [] TABLES = new String [] {“circles”};

私有(private)上下文上下文;
私有(private)OpenHelper openHelper;

公共(public)DBWrapper(上下文上下文){
context.deleteDatabase(DATABASE_NAME);
this.context =上下文;
this.openHelper =新的OpenHelper(this.context);
}

public void insertCircle(圆c)
{
字符串sql =“插入圆(x,y)值(” + c.getX()+“,” + c.getY()+“)”“;
Log.i(“DBWrapper::insertCircle()”,“正在执行sql:” + sql);
openHelper.getWritableDatabase()。execSQL(sql);
}

公共(public)无效clearCircles()
{
字符串sql =“从圈子中删除*”;
Log.i(“DBWrapper::clearCircles()”,“正在执行sql:” + sql);
openHelper.getWritableDatabase()。execSQL(sql);
}

公共(public)ArrayList getCircles()
{
ArrayList circle = new ArrayList();
游标cursor = openHelper.getWritableDatabase()。query(TABLES [0],null,null,null,null,null,null);
//光标游标= openHelper.getWritableDatabase()。rawQuery(“从圈子中选择*”,null);
Log.i(“DBWrapper::getCircles()”,“移至first1”);
如果(cursor.moveToFirst()){
Log.i(“DBWrapper::getCircles()”,“移至第一”);
做 {
Log.i(“DBWrapper::getCircles()”,“正在创建圆:” + cursor.getString(1)+“,” + cursor.getString(2));
circle.add(new Circle(Integer.parseInt(cursor.getString(1)),
Integer.parseInt(cursor.getString(2))));
} while(cursor.moveToNext());
}
if(cursor!= null &&!cursor.isClosed()){
cursor.close();
}
回圈
}
私有(private)静态类OpenHelper扩展了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); }
}
}

最佳答案

看一下您的DBWrapper构造函数,

你在打电话
context.deleteDatabase(DATABASE_NAME);
每次调用它都会删除数据库文件。强制SQLHelper重新创建数据库。

关于每次启动应用程序时,Android数据库都会重新创建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3366802/

10-12 04:50