我正在使用SQLiteOpenHelper的扩展。我的理解是onCreate仅在请求的数据库不存在时运行。每次打开数据库时都应该运行onOpen。
这似乎适用于我的应用程序中的活动 - 我需要在每个活动中实例化数据库帮助程序的新实例,并且运行onOpen但不运行onCreate。但是,每次重新启动应用程序时,都会调用onCreate。我误解了这应该如何工作,或者我只是错误地实现了它?
这是我的帮助班:
public class DBWrapper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "MyTest.db";
private static final int DATABASE_VERSION = 2;
public DBWrapper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("SQLite DBWrapper","OnCreate run");
ver1(db);
ver2(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("SQLite DBWrapper","OnUpgrade run; oldVer: " + oldVersion + "; newVer: " + newVersion);
if (oldVersion < 2) {ver2(db);}
}
@Override
public void onOpen(SQLiteDatabase db) {
Log.d("SQLite DBWrapper","OnOpen run");
}
private void ver1(SQLiteDatabase db) {
Log.d("SQLite Wrapper","Creating new Version 1");
db.execSQL("create table UserList (ID integer primary key, Name String, State String, Email String, Status String);");
db.execSQL("create table Contacts (ContactID integer, Display_Name String, Email_Address String, IsPrimary integer);");
}
private void ver2 (SQLiteDatabase db) {
Log.d("SQLite Wrapper","Updating to Version 2");
db.execSQL("create table ActivityRecord (UserID String, ActID String, ActDate date, Rating REAL, Comment String, RateDate date, primary key(UserID,ActID));");
}
//Other methods for inserting and retrieving data
}
这是我在每个活动中创建帮助器实例的方法:
private DBWrapper DBHelper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
DBHelper = new DBWrapper(this);
db = DBHelper.getWritableDatabase();
}
我的logcat指示每次重新启动应用程序时(至少在调试模式下)都会调用onCreate(以及ver1和ver2)。我做错了什么?
更新:我添加了更多日志记录,发现A)发布和调试版本都发生了这种情况; B)当我在onCreate中记录db.getVersion()时,它报告&#34; 0&#34;。所以这意味着当我关闭并重新打开应用程序时它忘记了版本号,或者在应用程序关闭时删除了数据库。
答案 0 :(得分:-2)
每次启动活动时都不要创建DBWrapper实例。只需在创建应用程序实例时创建一次,并在app的所有活动中使用相同的实例。如果您仍然注意到问题,请参阅。
我怀疑在您的应用程序中创建了多个DBWrapper实例(尽管多个实例应该在逻辑上有效)。
参考以下代码:
public class MyApplication extends Application {
DBWrapper mDbwrapper;
@Override
public void onCreate() {
super.onCreate();
mDbwrapper=new DBWrapper();//Share this object with all the activities of the class
}
}
将此行添加到清单:
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="MyApplication">