0

我正在通过本教程学习在 Android 上使用 Sqlite 。我无法理解某些代码。

  public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

我在我的活动中创建了一个新的 DatabaseHandler 对象。构造函数中的 super 是 SQLiteOpenHelper 构造函数。该代码效果很好,它会创建一个新数据库,如果没有,它会使用旧数据库(如果存在)。我想对此代码进行一些更改(我想将不同的表添加到一个数据库中),但我不明白这是如何工作的,构造函数如何知道它应该创建一个新的数据库还是使用现有的数据库?

4

2 回答 2

3

诀窍是你的类扩展了 SQLiteOpenHelper,super在你的构造函数中调用会触发很多幕后代码。

如果您通读SQLiteOpenHelper 源代码,您会看到getWritableDatabase()getReadableDatabase()调用相同的方法:SQLiteOpenHelper#getDatabaseLocked(). 这种方法完成了大部分工作。它可以根据您在一个简单命令中提供的信息来确定是否需要创建、打开、升级或其他任何数据库:super(context, DATABASE_NAME, null, DATABASE_VERSION);.

于 2012-11-17T21:13:28.780 回答
2

当你想打开你的数据库时,你调用 SQLiteOpenHelper.getReadableDatabase() 或 SQLiteOpenHelper.getWriteableDatabase()。如果数据库存在,则返回它的句柄。如果它不存在,系统会调用 onCreate(),您可以在其中执行 db.execSQL。

最好调用类 DatabaseOpenHelper 而不是 DatabaseHandler。它所做的是将创建数据库推迟到需要时,而不是在其他类的开头创建它。这对于由 SQLite 数据库支持的内容提供者特别有用。您应该使用 ContentProvider.onCreate() 进行非常快速的初始化,然后执行 SQLiteOpenHelper.onCreate() 来创建数据库。这样,系统可以在您的应用程序启动时加载您的 ContentProvider,但它不必对您的数据库做任何事情,直到有东西试图访问它。

于 2012-11-17T21:47:38.693 回答