Android:每次打开我的应用程序时,SQLite数据库助手都会运行onCreate

时间:2014-08-11 01:36:41

标签: android sqlite activity-lifecycle

我正在使用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;。所以这意味着当我关闭并重新打开应用程序时它忘记了版本号,或者在应用程序关闭时删除了数据库。

1 个答案:

答案 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">