2017-02-05 17 views
0

AndroidのSQLiteデータベースに新しいエントリを挿入しようとすると、構文エラーが原因で挿入が失敗します。形成されたクエリにはContentValuesインスタンスに追加された値は含まれていないようですが、その理由はわかりません。誰も私にエラーを指摘できますか?ここでContentValuesを使用してSQLite DBに挿入できません

はエラーメッセージです:

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); 
} 
の残りの部分を
+0

create tableメソッドと変数の宣言を投稿できますか? – KoalaKoalified

+0

@KoalaKoalified Np、done。 –

+1

@VictorBrunell問題は、挿入時に定数TRANS_COLとTIME_COLを使用しているためです。これらの定数はテーブルのフィールドのTYPEを持っていますが、挿入には名前とタイプではなくフィールドの名前のみを入れるべきです。 – Jonas452

答えて

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」が含まれていません。これらの変数にテキストを追加しているということです列名の最後には、 "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); 
} 

EDIT:

はまた、あなたが最終的に挿入しながら、いくつかの問題に実行するつもりだ...クラスの確認をデフォルトのIDあなたの作ります経由して挿入することがあるので、-1 IDは、次の増分を経由して上書きにあなたのINSERT文を変更されます:そして、それはあなたのIDのときを含めての問題だ

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

これまでずっと更新文を書くのではなく、エントリを更新したいのです。

+0

ありがとうございます。それは魅力のように働いた。 –

+0

素晴らしいよ、どうぞ。 – KoalaKoalified

関連する問題