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

时间:2011-07-22 14:55:19

标签: java android android-sqlite

我正在尝试制作我的第一款Android应用。我注意到,如果数据库不存在,则不会调用SQLiteOpenHelper.onCreate()方法来创建表。但是,即使我尝试调试,onCreate()方法也不起作用。

请查看下面的代码,并给我任何建议。任何帮助将不胜感激。

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();
        }
    }

11 个答案:

答案 0 :(得分:58)

我也遇到了 SQLiteOpenHelper 的问题。对我有用的是存储成员变量

SQLiteDatabase db;

在SQLiteOpenHelper子类中并调用

 db = getWritableDatabase();

在构造函数中。

此问题的答案还包括有用的信息:SQLiteOpenHelper failing to call onCreate?

我希望这有帮助!

答案 1 :(得分:23)

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

就像在实际需要时将在内存中创建数据库一样简单。:)

答案 2 :(得分:5)

我有一个类似的问题,其中onCreate没有被执行。也许这对某人有用,尽管事实证明这是一个不同的问题。

之前我正在研究数据库并且之前已经创建了很长时间。所以现在在onCreate()中进行更改后,我希望找到创建的新表。但SQLiteOpenHelper再也没有调用过onCreate()。原因是,数据库已经存在。我仍在使用与之前相同的设备,因此使用现有的(旧)数据库。

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

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

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

答案 3 :(得分:1)

我遇到了类似的问题,但问题不在于OnCreate

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

我的解决方案是定义一个名为CreateTable的单独类,它在OnCreate覆盖和

之后的构造函数中都被调用

db = getWritableDatabase();

答案 4 :(得分:1)

调用getWritableDatabase();在构造函数中

public DataBaseH(@Nullable Context context) {
    super(context, dataBaseName, null, dataBaseVersion);
    SQLiteDatabase db=this.getWritableDatabase();

}

@Override
public void onCreate(SQLiteDatabase db) {
 String createTable="CREATE TABLE IF NOT EXISTS "+tableName+                              " ( "+
            id+  " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"+
            name+                              " TEXT,"+
            familyName+                        " TEXT,"+
            age+                           " INTEGER);";

    db.execSQL(createTable);

     Log.i(TAG,"db.exect");


}

答案 5 :(得分:1)

我也遇到类似的问题,即在应用程序首次运行时onCreate()无法执行,因此我的数据库从未创建过。这与不执行onCreate()的情况不同,因为该数据库已经存在,因为该数据库尚不存在。具体来说,我的DataProvider onCreate()没有执行,因此也从未调用过OpenHelper。

我确认我已经按照每个人在先前答案中描述的方式进行了所有设置,但是没有任何解决方案可以解决我的问题。张贴此答案,以防其他人像我一样忘记一个小细节。

为我解决了这个问题的方法是,在AndroidManifest.xml中为我的数据提供者添加一个条目,该条目嵌套在标签内,并附带所有条目。我唯一需要的属性是:

  • android:name =“。DataManagement.DbDataProvider”
  • android:authorities =“ com.example.myApplicationName.DataManagement.DbDataProvider”
  • android:exported =“ false”

(请确保更改以上属性的值以匹配您的项目)

我为数据提供者清理,构建,运行和onCreate()方法,并正确执行打开的帮助程序类,并且在首次启动应用程序时创建了数据库!

答案 6 :(得分:0)

我遇到了同样的问题..我的解决方案是添加.db作为数据库名称的扩展名

答案 7 :(得分:-1)

在我的情况下,它没有被调用,因为数据库已经存在!因此,如果可能,请确保删除您的应用并重新安装,然后检查是否正在调用它。

答案 8 :(得分:-1)

检查数据库文件是否存在,然后通过调用

打开数据库的可写实例。

dbinstance.getWritableDatabase()

答案 9 :(得分:-1)

我遇到了同样的问题,似乎onCreate没有执行。我以为是因为未显示我的日志。原来我的SQL_create字符串中的空格有问题。

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        Log.d(LOG_TAG, "A table is created with this SQL-String: " + SQL_CREATE + " angelegt.");
        db.execSQL(SQL_CREATE);
    }
    catch (Exception ex) {
        Log.e(LOG_TAG, "Error when creating table: " + ex.getMessage());
    }
}

这是我更正后的SQL字符串:

enterpublic static final String SQL_CREATE =
        "CREATE TABLE " + TABLE_VOCAB_LIST +
                "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_GERMAN + " TEXT NOT NULL, " +
                COLUMN_SPANISH + " INTEGER NOT NULL, "+
                COLUMN_LEVEL + " INTEGER NOT NULL);)"; code here

我忘记了一个空格,当我添加空格时,一切正常。

答案 10 :(得分:-2)

您可以将 AUTOINCREMENT 更改为自动收入

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

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