Android SQLiteOpenHelper:onCreate()方法不被调用。 为什么?

我正在尝试制作我的第一个Android应用程序。 我听说SQLiteOpenHelper.onCreate()方法过程来创build表,如果没有创build数据库。 然而,即使我想要debugging,onCreate()方法也没有工作。 请看下面的代码,并给我任何build议。 任何帮助将不胜感激。

================================================================= public class NameToPinyinActivity extends Activity { DatabaseOpenHelper helper = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nametopinyin); Button searchButton = (Button) findViewById(R.id.search); searchButton.setOnClickListener(new ButtonClickListener()); helper = new DatabaseOpenHelper(NameToPinyinActivity.this); } ================================================================= public class DatabaseOpenHelper extends SQLiteOpenHelper { /** DB Name */ private static final String DB_NAME = "pinyin"; /** CREATE TABLE SQL */ private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN" + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)"; public DatabaseOpenHelper(Context context) { super(context, DB_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.beginTransaction(); try { db.execSQL(CREATE_TABLE_SQL); db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { db.endTransaction(); } } ================================================================= 

我也遇到了SQLiteOpenHelper问题 。 什么对我来说是存储一个成员variables

 SQLiteDatabase db; 

在SQLiteOpenHelper子类中调用

  db = getWritableDatabase(); 

在构造函数中。

这个问题的答案还包括有用的信息: SQLiteOpenHelper无法调用onCreate?

我希望这有帮助!

在调用SQLiteOpenHelper类的getWritableDatabase()getReadableDatabase()方法SQLiteOpenHelper ,不会创build数据库。

就像数据库在内存中被创build时一样简单:)

我有一个类似的问题,onCreate没有执行。 也许这对任何人都有用,尽pipe事实certificate这是一个不同的问题。

之前我曾经在数据库上工作过,而且之前已经创build了很久。 所以,现在在onCreate()进行更改后,我希望能find创build的新表。 但是SQLiteOpenHelper再也不会调用onCreate()。 原因是,数据库已经存在。 我仍然在使用与之前相同的设备,因此也使用了现有的(旧)数据库。

但是有希望。 当系统看到具有该名称的数据库时,它也检查版本号是否正确。 在这种情况下,我只是忘记数据库已经存在。 我的解决scheme只是改变版本号。 所以onUpgrade()被称为提供onCreate()更改的选项。

因此,选项是卸载完整的应用程序(并使用它的数据库),或者在升级版本号(例如删除)旧表并再次调用onCreate()之后再次调用onCreate。

在任何情况下,如果没有调用onCreate(),则在数据库存在的情况下检查两次。 否则,它不会再被调用。

我有一个类似的问题,但它不是OnCreate电话是问题。

在上面的示例代码中,Kevin解释说,如果数据库已经存在,则不会调用OnCreate 。 但是,如果像我一样使用来自不同活动的多个表格,那么尽pipe您可能已经创build了数据库,但与此活动关联的表格可能尚未创build。 因此,当您尝试将游标数据设置在不存在的表上时,将会调用一个exception。

我的解决scheme是定义一个名为CreateTable的单独的类,这是从OnCreate覆盖和从后面的构造函数调用

db = getWritableDatabase();

我有同样的问题..我的决议是添加.db作为数据库名称的扩展名

您可以将AUTOINCREMENT更改为AUTO INCREMENT

注意 SQLiteOpenHelper第一次创build数据库时调用onCreate 。 如果在onCreate方法中创build表,则不能创build新的SQLiteDatabase 。 你可以看到例子

  @Override public void onCreate(SQLiteDatabase db) { String stringCreateTable = "CREATE TABLE "+"tblUser"+" ( " + "id TEXT PRIMARY KEY, " + "name TEXT )"; db.execSQL(stringCreateTable); }