0

sqlite を使用してデータベース用の新しいテーブルを作成しようとしています。

String CREATE_ARCHIVE_TABLE = 
"CREATE TABLE {0} ({1} INTEGER PRIMARY KEY AUTOINCREMENT," +
" {2} TEXT NOT NULL, {3} TEXT NOT NULL, {4} TEXT NOT NULL, {5} INTEGER);";

db.execSQL(MessageFormat.format(CREATE_ARCHIVE_TABLE,AItext.TABLE_NAME,AItext._ID,
        AItext.TITLE,AItext.MESSAGE,AItext.DATE,AItext.TYPE));

インターフェースで:

public interface AItext extends BaseColumns {
  String TABLE_NAME = "table_name";
  String TITLE = "title";
  String MESSAGE = "message";
  String DATE = "date";
  String TYPE = "type";
  String[] COLUMNS = new String[]
  { _ID, TITLE, MESSAGE, DATE, TYPE };
}

しかし、次の例外があり、エラーが表示されません

android.database.sqlite.SQLiteException: near "INTEGER": syntax error: , 
while compiling: CREATE TABLE archive_contacts_name (_id INTEGER PRIMARY KEY
AUTOINCREMENT, message INTEGER, name TEXT NOT NULL, phone TEXT NOT NULL,
check INTEGER, note TEXT NOT NULL);
4

1 に答える 1

1

@aim が言ったように、CHECKは実際には列名として使用できない SQLite キーワードです。

CHECK 制約は、列定義に付加するか、テーブル制約として指定することができます。実際には違いはありません。新しい行がテーブルに挿入されるか、既存の行が更新されるたびに、各 CHECK 制約に関連付けられた式が評価され、CAST 式と同じ方法で NUMERIC 値にキャストされます。結果がゼロ (整数値 0 または実数値 0.0) の場合、制約違反が発生しています。CHECK 式が NULL またはその他のゼロ以外の値に評価される場合、それは制約違反ではありません。CHECK 制約の式にサブクエリを含めることはできません。

CHECK 制約は、バージョン 3.3.0 以降でサポートされています。バージョン 3.3.0 より前では、CHECK 制約は解析されましたが、強制されませんでした。

于 2013-08-23T14:49:06.813 に答える