无法在SQLiteOpenHelper.onCreate(SQLiteDatabase)中插入数据

时间:2014-06-08 10:53:16

标签: android sqlite android-sqlite

我可以使用SQLiteDatabase.insert(String, String, ContentValues)方法将行插入数据库。但由于某种原因,我无法在SQLiteOpenHelper.onCreate(SQLiteDatabase)内使用原始SQL语句。 CREATE命令可以正常工作,但INSERT命令不起作用。没有抛出SQLException。

以下是代码段:

@Override
public void onCreate(SQLiteDatabase db) {
    String SQL_CREATE_ENTRIES = "";
    SQL_CREATE_ENTRIES += "CREATE TABLE " + MyDatabaseContract.Release.TABLE_NAME;
    SQL_CREATE_ENTRIES += "\n(\n\t";
    SQL_CREATE_ENTRIES += MyDatabaseContract.Release._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,\n\t";
    SQL_CREATE_ENTRIES += MyDatabaseContract.Release.COLUMN_NAME_VERSION + " TEXT NOT NULL,\n\t";
    SQL_CREATE_ENTRIES += MyDatabaseContract.Release.COLUMN_NAME_TYPE + " INTEGER NOT NULL,\n\t";
    SQL_CREATE_ENTRIES += MyDatabaseContract.Release.COLUMN_NAME_DATE + " INTEGER,\n\t";
    SQL_CREATE_ENTRIES += MyDatabaseContract.Release.COLUMN_NAME_CHANGELOG + " TEXT";
    SQL_CREATE_ENTRIES += "\n);";

    // Insert some test data
    SQL_CREATE_ENTRIES += "\n\nINSERT INTO " + MyDatabaseContract.Release.TABLE_NAME + " VALUES(1, '8.0a', 3, 1234567890, 'Initial release');";
    SQL_CREATE_ENTRIES += "\nINSERT INTO " + MyDatabaseContract.Release.TABLE_NAME + " VALUES(2, '9.0c', 2, 1434567890, 'Fix bugs');";
    SQL_CREATE_ENTRIES += "\nINSERT INTO " + MyDatabaseContract.Release.TABLE_NAME + " VALUES(3, '9.1', 5, 1634567890, 'Add new features');";
    SQL_CREATE_ENTRIES += "\nINSERT INTO " + MyDatabaseContract.Release.TABLE_NAME + " VALUES(4, '9.22', 6, 1834567890, 'Final version');";

    db.execSQL(SQL_CREATE_ENTRIES);
}

我将SQL_CREATE_ENTRIES写入文件:

CREATE TABLE Releases
(
    _id INTEGER PRIMARY KEY AUTOINCREMENT,
    Version TEXT NOT NULL,
    Type INTEGER NOT NULL,
    Date INTEGER,
    Changelog TEXT
);

INSERT INTO Releases VALUES(1, '8.0a', 3, 1234567890, 'Initial release');
INSERT INTO Releases VALUES(2, '9.0c', 2, 1434567890, 'Fix bugs');
INSERT INTO Releases VALUES(3, '9.1', 5, 1634567890, 'Add new features');
INSERT INTO Releases VALUES(4, '9.22', 6, 1834567890, 'Final version');

我发现没什么不寻常的。可能是问题的原因是什么?

1 个答案:

答案 0 :(得分:2)

execSQL()只执行一个SQL语句。如果在;之后有更多SQL,则会忽略它。

;处的SQL拆分为单独的语句,并使用execSQL()单独执行每个语句。

来自documentation

  

sql要执行的SQL语句。不支持以分号分隔的多个语句。

在幕后,它归结为sqlite3_prepare*()的工作原理:

  

这些例程只编译zSql中的第一个语句,因此* pzTail指向仍未编译的内容。

诸如sqlite3之类的工具会继续准备和执行新语句,直到输入尾部耗尽或发生错误。