SQLiteOpenHelper没有调用onCreate方法?

31

我正在尝试使用sqlite在Android手机上创建本地数据库。

我有一个辅助类,如下所示,用于创建数据库并提供“帮助”。

我想在代码的主要部分创建该类的对象,并在那里创建数据库和表。

问题:

每当我创建该类的一个对象时,似乎没有调用辅助类中的onCreate方法。我认为应该会发生这种情况,我认为onCreate基本上是该类的构造函数。(我相信我错了)

  • 那么,为什么它不调用onCreate方法?
  • 或者我如何让它在我创建该类的对象处创建数据库和表?
  • 如果这不是一个好方法,有什么更好的方法可以做到这一点?

public class SmartDBHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "smart_lite_db.db";
    private static final int DATABASE_VERSION = 2;
    private static final String NOTIFY_TABLE_NAME = "user_notify_data";
    private static final String HR_TABLE_NAME = "user_hr_data";
    private static final String NOTIFY_TABLE_CREATE = 
        "CREATE TABLE " + NOTIFY_TABLE_NAME + 
        " (counter INTEGER PRIMARY KEY, " + 
        "userresponse INTEGER, " + 
        "notifytime INTEGER);";
    private static final String DATA_TABLE_CREATE = 
        "CREATE TABLE " + HR_TABLE_NAME +
        " (counter INTEGER PRIMARY KEY, " +
        "hr INTEGER, " +
        "act INTEGER, " +
        "timestamp INTEGER);";      

    public SmartDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        Log.v("smartdbhelper", "before creation");
        db.execSQL(NOTIFY_TABLE_CREATE);
        Log.v("smartdbhelper", "middle creation");
        db.execSQL(DATA_TABLE_CREATE);
        Log.v("smartdbhelper", "after creation");
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) {
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
   }
}
4个回答

70

onCreate不是数据库类的构造函数。仅当您尝试打开不存在的数据库时才会调用它。要打开/创建数据库,您需要添加以下方法之一的调用:

public class SmartApp extends Activity implements OnSharedPreferenceChangeListener {
   private SmartDBHelper dBHelper;
   public void onCreate(Bundle savedInstanceState) {
      //where i am wanting to create the database and tables
      dBHelper = new SmartDBHelper(getContext());
      // open to read and write
      dBHelper.getWritableDatabase();
      // or to read only
      // dBHelper.getReadableDatabase();
   }
}

这是我的DatabaseAdapter,有点大但你可以看一下:http://saintfeintcity.org/projects/sfc/repository/entry/trunk/src/org/saintfeintcity/database/GameDbAdapter.java


很酷,谢谢。如果我想要一个像你的那样持有所有SQL处理内容的类,我该如何在所有其他类中访问该类的对象?例如,我在我的主类中创建了该对象。现在我想在我的主类中创建的另一个类中使用插入方法。我如何在另一个类中访问在主类中创建的原始数据库对象? - prolink007
实际上,我只需要在需要DatabaseHelper的每个类中创建一个新对象吗?我相信这就是我应该做的,如果没有人回复,我可能会把它作为一个问题来问。谢谢。 - prolink007
我解决了这个异常。我调用了两次db = eventsData.getReadableDatabase(); 这就是为什么会抛出异常的原因。 - jennifer
@WarrenFaith 为什么这对我不起作用...我使用了与你类似的代码,但是onCreate中的代码根本没有执行... - Marko
我发现onCreate只在应用程序首次启动时被调用。此后,数据库文件已经存在,Android知道不应再次调用onCreate(这是我的猜测)。我卸载了应用程序并从Eclipse重新启动它,最终看到了来自onCreate内部的预期Logcat消息。 - Jacob Wan
显示剩余3条评论

14

您需要调用getWritableDatabase()getReadableDatabase()


现在正在测试,我相信你是对的。我刚刚检查了安卓示例并发现了这个。我一定是疏忽了它,会告诉你结果如何。谢谢。 - prolink007

2

onCreate()方法不是构造函数,它会在数据库第一次创建时被调用。因此,您需要调用getWritableDatabase()getReadableDatabase()来打开或创建您的数据库。

getReadableDatabase():创建和/或打开一个数据库。

getWritableDatabase():创建和/或打开一个可用于读写的数据库。


0
一个原因是SQLiteOpenHelper.onCreate()没有被调用是因为设备上已经存在数据库文件。
如果你在Android Studio中转到“View > Tool Windows > App Inspection”,你可以进入“Database Inspector”并查看设备上的SQLite文件。
在存在同名数据库的情况下,如果onCreate没有被调用,你可以在你的应用中更改数据库名称为新的名称。然后数据库文件将不存在,因此onCreate将被调用。
static class MyDatabaseHelper extends SQLiteOpenHelper {
    private DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION); // A new DB_NAME here means onCreate() will get called.
        mDatabaseHelper = this;
    }
    ....
    ....
}

如果上述的DB_NAME是之前从未使用过的,那么onCreate()函数将会运行,但如果你试图重复使用一个已存在的名称,onCreate()函数将不会运行。
我发现在应用程序开发过程中,最简单的做法就是在迭代过程中不断创建新的DB_NAME

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接