使用 ContentValues 插入 SQLite 数据库失败
Insert into SQLite DB fails using ContentValues
尝试将新条目插入 Android 中的 SQLite 数据库时,由于语法错误,插入失败。似乎形成的查询不包含添加到 ContentValues 实例的值,但我不确定为什么。谁能指出错误?
错误信息如下:
E/SQLiteLog: (1) near "TEXT": syntax error
E/SQLiteDatabase: Error inserting TIME_DATE TEXT=barbaz TRANSCRIPT TEXT=foobar
android.database.sqlite.SQLiteException: near "TEXT": syntax error (code 1): , while compiling: INSERT INTO approvals_t(TIME_DATE TEXT,TRANSCRIPT TEXT) VALUES (?,?)
这是我用来测试它的代码:
public boolean insertData(String transStr, String timeStr) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cValues = new ContentValues();
cValues.put(TRANS_COL,"foobar");
cValues.put(TIME_COL,"barbaz");
// res is -1, the values couldn't be inserted
long res = db.insert(APVLS_TABLE_NAME,null,cValues);
if(res != -1)
return true;
else
return false;
}
(编辑)其余代码
public class DBHelper extends SQLiteOpenHelper implements BaseColumns {
public static final String DB_NAME = "Transcripts.db";
public static final String APVLS_TABLE_NAME = "approvals_t";
public static final String ID_COL = BaseColumns._ID;
public static final String TRANS_COL = "TRANSCRIPT TEXT";
public static final String TIME_COL = "TIMEDATE TEXT";
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create a sql command that builds a table
String SQL_CREATE_APVLS_TABLE = "CREATE TABLE " + APVLS_TABLE_NAME + " ("
+ ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TRANS_COL + ", "
+ TIME_COL + ");";
// Execute sql statement
db.execSQL(SQL_CREATE_APVLS_TABLE);
}
对您的声明的一些更改:
public static final String TRANS_COL = "TRANSCRIPT";
public static final String TIME_COL = "TIMEDATE";
给你的作品table:
String SQL_CREATE_APVLS_TABLE = "CREATE TABLE " + APVLS_TABLE_NAME + " ("
+ ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TRANS_COL + " TEXT, "
+ TIME_COL + " TEXT);";
它不起作用的原因是您已将 TEXT 附加到那些变量,这些变量创建了一个名称为 TEXT 类型的字段,但在列名末尾不包含单词“TEXT”,因此您可以't select 来自名为 "TRANSCRIPT TEXT".
的列
另外一些我建议的其他改变是改变这个:
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
收件人:
private static final int dbVersion = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, dbVersion);
}
这确保如果你想改变你的版本,它只是通过改变一个变量而不是构造函数。
以及备份数据后测试时:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + APVLS_TABLE_NAME);
onCreate(db);
}
编辑:
此外,您最终在插入时会 运行 遇到一些问题...请确保您插入时 class 的默认 ID 为 -1,以便通过下一次递增并将插入语句更改为:
db.insertWithOnConflict(TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
然后只需在您想更新条目时包含您的 ID,而不是编写一大堆更新语句。
尝试将新条目插入 Android 中的 SQLite 数据库时,由于语法错误,插入失败。似乎形成的查询不包含添加到 ContentValues 实例的值,但我不确定为什么。谁能指出错误?
错误信息如下:
E/SQLiteLog: (1) near "TEXT": syntax error
E/SQLiteDatabase: Error inserting TIME_DATE TEXT=barbaz TRANSCRIPT TEXT=foobar
android.database.sqlite.SQLiteException: near "TEXT": syntax error (code 1): , while compiling: INSERT INTO approvals_t(TIME_DATE TEXT,TRANSCRIPT TEXT) VALUES (?,?)
这是我用来测试它的代码:
public boolean insertData(String transStr, String timeStr) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cValues = new ContentValues();
cValues.put(TRANS_COL,"foobar");
cValues.put(TIME_COL,"barbaz");
// res is -1, the values couldn't be inserted
long res = db.insert(APVLS_TABLE_NAME,null,cValues);
if(res != -1)
return true;
else
return false;
}
(编辑)其余代码
public class DBHelper extends SQLiteOpenHelper implements BaseColumns {
public static final String DB_NAME = "Transcripts.db";
public static final String APVLS_TABLE_NAME = "approvals_t";
public static final String ID_COL = BaseColumns._ID;
public static final String TRANS_COL = "TRANSCRIPT TEXT";
public static final String TIME_COL = "TIMEDATE TEXT";
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create a sql command that builds a table
String SQL_CREATE_APVLS_TABLE = "CREATE TABLE " + APVLS_TABLE_NAME + " ("
+ ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TRANS_COL + ", "
+ TIME_COL + ");";
// Execute sql statement
db.execSQL(SQL_CREATE_APVLS_TABLE);
}
对您的声明的一些更改:
public static final String TRANS_COL = "TRANSCRIPT";
public static final String TIME_COL = "TIMEDATE";
给你的作品table:
String SQL_CREATE_APVLS_TABLE = "CREATE TABLE " + APVLS_TABLE_NAME + " ("
+ ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TRANS_COL + " TEXT, "
+ TIME_COL + " TEXT);";
它不起作用的原因是您已将 TEXT 附加到那些变量,这些变量创建了一个名称为 TEXT 类型的字段,但在列名末尾不包含单词“TEXT”,因此您可以't select 来自名为 "TRANSCRIPT TEXT".
的列另外一些我建议的其他改变是改变这个:
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
收件人:
private static final int dbVersion = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, dbVersion);
}
这确保如果你想改变你的版本,它只是通过改变一个变量而不是构造函数。
以及备份数据后测试时:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + APVLS_TABLE_NAME);
onCreate(db);
}
编辑:
此外,您最终在插入时会 运行 遇到一些问题...请确保您插入时 class 的默认 ID 为 -1,以便通过下一次递增并将插入语句更改为:
db.insertWithOnConflict(TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
然后只需在您想更新条目时包含您的 ID,而不是编写一大堆更新语句。