2013-12-11 2 views
2

Вот мой код:SQLite ошибка синтаксиса около "CREATE TABLE"

String CREATE_DATABASE = "CREATE TABLE " + TABLE_NAME + "(" + 
      KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      "title TEXT, "+ 
      "author TEXT, "+ 
      "state TEXT);"; 

    db.execSQL(CREATE_DATABASE); 

LogCat говорит: 12-11 23: 43: 50,553: E/AndroidRuntime (3706): android.database.sqlite.SQLiteException: рядом с «CREATE TABLE»: синтаксическая ошибка (код 1): при компиляции: CREATE TABLE PapersTable (_id INTEGER PRIMARY KEY AUTOINCREMENT, TEXT, ТЕКСТ автора, TEXT состояния);

ответ

-1

В SQLite, столбец объявлен первичный ключ, будет автоматическое приращение, поэтому попытайтесь удалить, что:

String CREATE_DATABASE = "CREATE TABLE " + TABLE_NAME + "(" + 
     KEY_ID + " INTEGER PRIMARY KEY, " + 
     "title TEXT, "+ 
     "author TEXT, "+ 
     "state TEXT);"; 

Смотрите эту answer для справки.

+0

Связанный ответ неверен. SQLite поддерживает 'AUTOINCREMENT', а семантика' INTEGER PRIMARY KEY' и 'INTEGER PRIMARY KEY AUTOINCREMENT' немного отличается. См. Http://www.sqlite.org/autoinc.html – laalto

-1

Попробуйте этот код в методе onCreate.

  1. Удалить AUTOINCREMENT для KEY_ID, поскольку он уже объявлен как основной ключ.
  2. Удалить ";" вы разместили сразу после последней скобки в строке, то есть вторую последнюю точку с запятой в строке CREATE_DATABASE.
  3. Удалить db.close() из OnCreate()

Код Замена: Строка create_database = «CREATE TABLE "+ TABLE_NAME +"("+ KEY_ID +" INTEGER PRIMARY KEY, "+ KEY_TITLE +" TEXT , "+ KEY_AUTHOR +" TEXT, "+ KEY_STATE +" TEXT) "; db.execSQL (CREATE_DATABASE);

+0

Удаление AUTOINCREMENT изменит семантику, а точка с запятой в конце инструкции SQL, будучи лишней, работает нормально. –

+0

Нет необходимости использовать AUTOINCREMENT в атрибуте первичного ключа, так как это свойство уже получено PRIMARY KEY. Точка с запятой в конце создания скобки для таблицы не является правильным способом создания таблицы, поэтому plz удаляет ее. db.close() также не требуется в onCreate(), как это требуется, когда мы выполняем некоторые операции над таблицами базы данных, чтобы вы могли также удалить это. –

+0

Без AUTOINCREMENT идентификаторы удаленных записей могут быть повторно использованы. (Прочитайте [документацию] (http://www.sqlite.org/autoinc.html)!) В точку с запятой нет ничего неправильного (и в любом случае это не имеет ничего общего с проблемой в вопросе). –

2

Синтаксис CREATE TABLE в порядке, поскольку вы его разместили.

Я подозреваю, что существует неразрывное пространство (ASCII 0xA0) между CREATE и TABLE. Замените его на обычное пространство (ASCII 0x20). Это объясняет возникшую синтаксическую ошибку: парсер обрабатывает CREATE TABLE как единственный неизвестный токен, а не как два отдельных известных токена CREATE и TABLE.

Что определенно неправильно, что вы вызываете db.close() на SQLiteDatabase db в качестве параметра к вашей функции. Вы должны закрывать только те базы данных, которые вы открыли сами, и закрытие этого пути приведет к исключению, хотя и другому.

Смежные вопросы