我可以使用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');
我发现没什么不寻常的。可能是问题的原因是什么?
答案 0 :(得分:2)
execSQL()
只执行一个SQL语句。如果在;
之后有更多SQL,则会忽略它。
将;
处的SQL拆分为单独的语句,并使用execSQL()
单独执行每个语句。
sql要执行的SQL语句。不支持以分号分隔的多个语句。
在幕后,它归结为sqlite3_prepare*()
的工作原理:
这些例程只编译zSql中的第一个语句,因此* pzTail指向仍未编译的内容。
诸如sqlite3之类的工具会继续准备和执行新语句,直到输入尾部耗尽或发生错误。