1

Android Phone 用のメール クライアントを作成しました。メールを SQLite データベースに保存したいと考えています。しかし、データベースにテスト データのみを入力したい場合は、次のエラーが発生します。

E/SQLiteLog(21212): (1) "TO" 付近: 構文エラー

E/SQLiteDatabase(21212): SUBJECT=test subject TO=emailadress2 FROM=emailadress1 CONTENT=test content の挿入中にエラーが発生しました

android.database.sqlite.SQLiteException: 「TO」付近: 構文エラー (コード 1): 、コンパイル中: INSERT INTO MAIL(SUBJECT,TO,FROM,CONTENT) VALUES (?,?,?,?)

(...)

(1) "FROM" 付近: 構文エラー

E/Error(21212): android.database.sqlite.SQLiteException: near "FROM": 構文エラー (コード 1): 、コンパイル中: SELECT ID、FROM、TO、SUBJECT、CONTENT FROM MAIL WHERE ID = -1

データベースには次のコードを使用します。

MAINACTIVITY.java

public void dbCreate(View view){
    String from = "emailadress1";
    String to = "emailadress2";
    String subject = "test subject";
    String content = "test content";

    try {
        datasource.open();
        datasource.createEntry(from, to, subject, content);
        datasource.close();
        }
        catch (Exception ex) {
            Toast.makeText(this,"Error", Toast.LENGTH_LONG).show();
            Log.e("Error", ex.toString());
            }
}

MYSQLiteHelper.java

private static final String DATABASE_NAME = "mail.db";
private static final int DATABASE_VERSION = 1;


private static final String TABLE_CREATE_MAIL = "CREATE TABLE MAILS (  ID integer PRIMARY KEY AUTOINCREMENT, FROM TEXT, TO TEXT, SUBJECT TEXT, CONTENT TEXT);";



public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase database) {
    Log.i("Info", "OnCreate aufgerufen");
    database.execSQL(TABLE_CREATE_MAIL);

}

DATASOURCE.java

private SQLiteDatabase database;
private MySQLiteHelper dbHelper;
private String[] allColumns = { "ID", "FROM",
        "TO", "SUBJECT", "CONTENT"};
public Entry createEntry(String from, String to, String subject, String content) {
    ContentValues values = new ContentValues();
    values.put("FROM", from);
    values.put("TO", to);
    values.put("SUBJECT", subject);
    values.put("CONTENT", content);

    long insertId = database.insert("MAIL", null,
            values);


    Cursor cursor = database.query("MAIL",allColumns, "ID = " + insertId, null, null, null, null, null);
    cursor.moveToFirst();

    return cursorToEntry(cursor);
}
4

3 に答える 3

2

TOおよびSQLLiteFROM予約語です。

してみてください:

INSERT INTO MAIL(SUBJECT,`TO`,`FROM`,CONTENT) VALUES (?,?,?,?)

任意の SQL コマンドを実行したくない場合は、列の名前をTO_andに変更するだけFROM_です。

あなたはそれらを次のように引用しようとすることができます:

...
private String[] allColumns = { "ID", "`FROM`", "`TO`", "SUBJECT", "CONTENT"};
...
cv.put("`FROM`", from);
cv.put("`TO`", to);
...

さらに: vinoth がコメントしたように、テーブル名を修正する必要があります (MAIL または MAILS)

于 2013-05-04T11:31:02.203 に答える