Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上使用Sqlite_Android_Sqlite_Sqliteopenhelper - Fatal编程技术网

在Android上使用Sqlite

在Android上使用Sqlite,android,sqlite,sqliteopenhelper,Android,Sqlite,Sqliteopenhelper,我正在学习通过使用在Android上使用Sqlite。我很难理解一些代码 public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // Creating Tables @Override public void onCreate(SQLiteDatabase db) { String C

我正在学习通过使用在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构造函数。代码工作得很好,如果没有,它会创建一个新的数据库,如果存在,它会使用旧的数据库。我想对这段代码做一些修改(我想在一个db中添加不同的表),但我不明白这到底是如何工作的,构造函数如何知道它应该创建一个新的db还是使用现有的db?

诀窍在于您的类扩展了SQLiteOpenHelper,在构造函数中调用
super
,会触发大量幕后代码


如果通读,您将看到
getWritableDatabase()
getReadableDatabase()
调用相同的方法:
SQLiteOpenHelper\getDatabaseLocked()
。这种方法完成了大部分工作。它根据您在一个简单命令中提供的信息确定是否需要创建、打开、升级数据库或其他任何内容:
super(context,database\u NAME,null,database\u VERSION)

诀窍在于您的类扩展了SQLiteOpenHelper,在构造函数中调用
super
会触发大量幕后代码


如果通读,您将看到
getWritableDatabase()
getReadableDatabase()
调用相同的方法:
SQLiteOpenHelper\getDatabaseLocked()
。这种方法完成了大部分工作。它根据您在一个简单命令中提供的信息确定是否需要创建、打开、升级数据库或其他任何内容:
super(context,database\u NAME,null,database\u VERSION)

当您想打开数据库时,可以调用SQLiteOpenHelper.getReadableDatabase()或SQLiteOpenHelper.getWriteableDatabase()。如果数据库存在,则返回一个句柄。如果不存在,系统将调用onCreate(),在这里执行db.execSQL


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

当您要打开数据库时,可以调用SQLiteOpenHelper.getReadableDatabase()或SQLiteOpenHelper.getWriteableDatabase()。如果数据库存在,则返回一个句柄。如果不存在,系统将调用onCreate(),在这里执行db.execSQL


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

OK。但创建表的onCreate函数何时调用?如果不存在数据库,则只有在调用
getWritableDatabase()
后,SQLiteOpenHelper才会调用该函数。但是如果要在现有数据库中创建新表,该怎么办。@BorutFlis:“但如果要在现有数据库中创建新表,该怎么办?”,然后增加架构版本(
DATABASE_VERSION
在代码示例中),并将添加新表逻辑放入
onUpgrade()中
。这个过程让人想起Rails迁移和类似的数据库部署机制。好的。但是创建表的onCreate函数何时调用?如果不存在数据库,则只有在调用
getWritableDatabase()后,SQLiteOpenHelper才会调用它
。但是如果要在现有数据库中创建一个新表该怎么办。@BorutFlis:“但是如果要在现有数据库中创建一个新表该怎么办”--然后增加模式版本(
DATABASE\u version
在代码示例中),并将添加新表逻辑放入
onUpgrade()
。这个过程让人想起Rails迁移和类似的数据库部署机制。