使用ContentValues插入SQLite DB失败

时间:2017-02-05 20:53:39

标签: android database sqlite syntax-error

尝试在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);
}

1 个答案:

答案 0 :(得分:2)

声明的一些更改:

public static final String TRANS_COL = "TRANSCRIPT";
public static final String TIME_COL = "TIMEDATE";

到你的创建表:

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"在列名称的末尾,您无法从名为" 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);
}

编辑:

此外,您最终在插入时会遇到一些问题...请确保您插入的类的默认ID为-1,以便通过下一个增量覆盖ID,并将insert语句更改为:

db.insertWithOnConflict(TABLE_NAME, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);

然后,只要您想要更新条目而不是编写一大堆更新语句,就可以包含您的ID。