构造函数做两件事情,首先,检查数据库是否存在,如果不存在,则调用onCreate方法创建数据库。然后,如果数据库已经存在了,那么检查数据库版本是否和构造函数中传入的数据库版本值一致,从而决定数据库是不是已经更新(updated)过了,如果需要更新,则调用onUpgrade方法。

  另外,如上所述,我们已经知道onCreate方法只有当数据库不存在的时候才会被调用,因此如果你想在程序安装以后第一次运行时做什么操作的话,这个方法倒不失为一个很方便的手段,你可以在这个方法中调用任何其他方法,比如说许可协议说明对话框。

  让我们回头看看数据库本身,因为本文只是一个说明性质的文章,因此这里我只是创建一个简单的雇员信息数据库,创建数据库的SQL脚本如下所示:
 
CREATE TABLE employees (
 _id INTEGER PRIMARY KEY AUTOINCREMENT,
 name TEXT NOT NULL,
 ext TEXT NOT NULL,
 mob TEXT NOT NULL,
 age INTEGER NOT NULL DEFAULT '0'
);

  我们可以很容易的用hard coding的方式将创建脚本写死在代码中,一行对应一行,代码如下:
 
@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL(
     
 "CREATE TABLE employees ( _id INTEGER PRIMARY KEY "
    + "AUTOINCREMENT, name TEXT NOT NULL, ext TEXT NOT NULL, "
    + "mob TEXT NOT NULL, age INTEGER NOT NULL DEFAULT '0')");
}

  但正如你所想的那样,当数据库大小达到了某个值,或者复杂性达到了某个程度时,这种做法会非常不灵活,因此理想的做法是将SQL脚本放到一个asset文件中。如果这样做的话,你需要写一个方法从assets目录中读取SQL脚本,然后执行它:

@Override
public void onCreate(SQLiteDatabase database) {
    executeSQLScript(database, "create.sql");
}
 
private void executeSQLScript(SQLiteDatabase database, string dbname){
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte buf[] = new byte[1024];
        int len;
        AssetManager assetManager = context.getAssets();
        InputStream inputStream = null;
 
        try{
            inputStream = assetManager.open(dbname);
            while ((len = inputStream.read(buf)) != -1) {
                   outputStream.write(buf, 0, len);
                }
            outputStream.close();
            inputStream.close();
                String[] createScript = outputStream.toString().split(";");
                for (int i = 0; i < createScript.length; i++) {
                    String sqlStatement = createScript[i].trim();
                    // TODO You may want to parse out comments here
                    if (sqlStatement.length() > 0) {
                        database.execSQL(sqlStatement + ";");
                    }
            }
       } catch (IOException e){
            // TODO Handle Script Failed to Load
        } catch (SQLException e) {
            // TODO Handle Script Failed to Execute
       }
}