SQLiteOpenHelper - 数据库是如何创建的?

时间:2012-09-03 20:23:38

标签: java android database sqlite sqliteopenhelper

我正在创建一个数据库应用程序,我的程序正常运行,而且我已经理解了我一直关注的大部分教程。但是,有一方面我不清楚。

MyDBHelper的内部类扩展了SQLiteOpenHelper。 外部变量包括名为d的SQLiteDatabase。 MyDBHelper的代码是:

private static class MyDBHelper extends SQLiteOpenHelper {
        MyDBHelper(Context c) {
            super(c, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) {
            Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data.");
            db.execSQL("DROP TABLE IF EXISTS GM");
            onCreate(db);
        }
    }

我的问题是这是如何实际创建初始数据库的。它出现在onCreate()方法中,但据我所知,这是从不调用。我知道它是在第一次创建数据库时调用的,但在哪里?而且,它如何通过SQLiteDatabase数据库?我还没有将任何数据库传递给该方法。我的外部类的SQLiteDatabase db变量如何设置为创建的数据库?有人能像白痴一样跟我说话吗?

7 个答案:

答案 0 :(得分:8)

onCreate()onUpgrade()方法实际上是在创建Db时第一次调用的。 事实上,它已在getReadableDatabase() or getWritebleDatabase()的{​​{1}}方法中进行了检查。它将检查数据库目录中是否已存在DB以及它的版本是什么。根据这个,它将调用SQLiteOpenHelper。如果db文件存在且版本正确,则不执行任何操作。

您可以搜索代码以执行onCreate(), or onUpgrade()。这是执行此项检查的时间。

如果需要更多详细信息,请与我们联系。祝你好运

答案 1 :(得分:3)

请记住,您正在扩展SQLiteOpenHelper,所有的魔法都发生在这个超级类中,特别是当您调用getReadableDatabase()getWritableDatabase()时,最初创建(或只是重新打开)数据库。这两种方法:

  • 定义SQLiteDatabase db变量(并控制将db传递给您的回调方法)
  • 通过调用db方法或打开现有数据库
  • 来初始化onCreate(db)
  • 检查版本号,并在必要时致电onUpgrade(db)onDowngrade(db)

他们还会调用一些回调方法,例如onConfigure(db)onOpen(db)等(Read more关于这些方法。)如果有帮助,可以通读{{3}你自己去了解所有这些发生的方式和时间的结构。

答案 2 :(得分:1)

onCreate()方法不是此类的构造函数。创建数据库时会调用onCreate。

这里PeopleDB扩展了SQLiteOpenHelper。此代码来自不同的类,当getWritableDatabase()或getReadableDatabase()或任何类型的名称被调用时,将调用onCreate

  PeopleDB db = null; //onCreate NOT called here
  db=new PeopleDB(getContext());
  db.getWritableDatabase();  //onCreate is called here!

希望有所帮助。

答案 3 :(得分:1)

请参阅我们的数据库是在openhelper的构造函数本身中创建的,而不是在重写的onCreate方法中创建的。在onCreate方法中,我们触发了一个查询,用于在数据库中创建一个表,该表在open helper的构造函数中创建,用于插入不创建数据库的数据。

另一件事是SQLiteDatabase对象未在SQLiteOpenHelper类中实例化。它在您希望使用数据库执行数据库操作的类中实例化,您需要编写这样的函数来初始化或打开数据库以准备插入。

SQLiteDatabase database;

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that

    public void open() throws SQLException {
            database = profiloHelper.getWritableDatabase();
        }

以下是您必须为数据库中的任何操作编写的代码,例如插入删除任何内容,您只需要更改QUERY

SQLiteStatement insert_stmt = null;

        try {
            insert_stmt = database.compileStatement(YOUR_QUERY);

            insert_stmt.bindString(1,   field1);
            insert_stmt.bindString(2,   field2);
            insert_stmt.executeInsert();
        }
        finally {
            if (insert_stmt != null) insert_stmt.close();
        }

答案 4 :(得分:0)

可能是getReadableDatabase()getWriteableDatabase()第一次被召唤时


答案 5 :(得分:0)

您创建了一个实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和可选的onOpen(SQLiteDatabase)的子类,该类负责打开数据库(如果存在),创建数据库(如果不存在),以及升级如有必要。 (Android开发者网站)

答案 6 :(得分:0)

班级SQLiteOpenHelper有充分理由称为“助手”。它为我们的应用编写者节省了相当大的精力。

您致电getWritableDatabase(或getReadableDatabase)的第一次,用于实施SQLiteOpenHelper,您的super语句在构造函数中传递您更喜欢Context的超类构造函数的当前NAME和数据库SQLiteOpenHelper

然后,超类构造函数为SQLiteDatabase设置初始空间,并为其指定通过super的名称。

完成后,超类构造函数调用onCreate并传递它通过SQLiteDatabase唯一参数创建的命名onCreate。由于onCreate只被调用一次,因此它是调用execSQL来定义数据库结构的好地方。

getReadableDatabase(或getWritableDatabase)的后续执行只会为您打开数据库,而不会再次调用onCreate。 (当超类构造函数指出super已发送不同的版本号时,onUpgrade为calle。)

理解SQLiteOpenHelper创建没有明显代码的数据库的方式以及heck onCreate如何通过“突然出现”的参数传递给我一个真正的苦差事。现在我无法相信它可能一直很难。