Ошибка создания таблицы Android (рядом с «автоинкрементом»: синтаксическая ошибка)? - PullRequest
10 голосов
/ 29 сентября 2011
 public static final String MYDATABASE_NAME = "MY_DATABASE";
 public static final String MYDATABASE_TABLE = "MY_TABLE";
 public static final String MYDATABASE_TABLE2 = "MY_TABLE2";
 public static final int MYDATABASE_VERSION = 1;
 public static final String KEY_ID = "_id";
 public static final String KEY_ID2 = "_id2";
 public static final String KEY_CONTENT1 = "Content1";
 public static final String KEY_CONTENT2 = "Content2";
 public static final String KEY_CONTENT3 = "Content3";

 //create table MY_DATABASE (ID integer primary key, Content text not null);
 private static final String SCRIPT_CREATE_DATABASE = "create table " + MYDATABASE_TABLE + " (" 
                                                        +KEY_ID + " integer primary key autoincrement, " 
                                                        + KEY_CONTENT1 + " text not null);";

 private static final String SCRIPT_CREATE_DATABASE2 = "create table " + MYDATABASE_TABLE2 + " (" 
                                                        + KEY_ID2 + " integer autoincrement, " 
                                                        + KEY_CONTENT2 + " text not null, " 
                                                        + KEY_CONTENT3 + " text not null, "
                                                        + " FOREIGN KEY ("+KEY_ID2+") REFERENCES "+MYDATABASE_TABLE+" ("+KEY_ID+"));";

Я не могу узнать, что дает следующую ошибку, пожалуйста, помогите мне спасибо.

09-29 13: 41: 19.760: ОШИБКА / База данных (334): Ошибка 1 (рядом "autoincrement": синтаксическая ошибка) в 0x218df0 при подготовке 'create таблица MY_TABLE2 (целочисленный автоинкремент _id2, текст Content2 не нулевой, Текст Content3 не нулевой, FOREIGN KEY (_id2) ССЫЛКИ MY_TABLE (_Id));»

.

09-29 13: 41: 19.770: DEBUG / AndroidRuntime (334): выключение виртуальной машины

09-29 13: 41: 19.770: WARN / dalvikvm (334): threadid = 1: выход из потока с необученным исключением (группа = 0x4001d800)

09-29 13: 41: 19.791: ОШИБКА / AndroidRuntime (334): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: main

09-29 13: 41: 19.791: ОШИБКА / AndroidRuntime (334): java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {sep.com/sep.com.SepActivity}: android.database.sqlite.SQLiteException: рядом с "автоинкрементом": синтаксис ошибка: создайте таблицу MY_TABLE2 (_id2 целочисленный автоинкремент, Content2 текст не нулевой, текст Content3 не нулевой, FOREIGN KEY (_id2) ССЫЛКИ MY_TABLE (_id));

Ответы [ 5 ]

37 голосов
/ 29 сентября 2011

Вкратце: In SQLite a column declared INTEGER PRIMARY KEY will autoincrement. В SQLite нет ключевого слова autoincrement, поэтому вы получаете сообщение об ошибке.

Подробнее об этом можно узнать в FAQ по SQLite .

РЕДАКТИРОВАТЬ: просто писать integer primary key достаточно.SQLite автоматически увеличит ваш ids.

EDIT2: Ваш onUpgrade() метод должен выглядеть следующим образом:

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            Log.w("MyAppTag","Updating database from version " + oldVersion + " to "
                    + newVersion + " .Existing data will be lost.");
            db.execSQL("DROP TABLE IF EXISTS " + MY_TABLE);
            db.execSQL("DROP TABLE IF EXISTS " + MY_TABLE2);
            onCreate(db);
        }
8 голосов
/ 29 сентября 2011

Это:

+ KEY_ID2 + " integer autoincrement, " 

должно быть так:

+ KEY_ID2 + " integer primary key autoincrement, " 

Если вы будете следовать синтаксическим диаграммам для CREATE TABLE, вы увидите, что autoincrement должен следовать только после primary key.

enter image description here enter image description here

Если вы хотите, чтобы _id2 был внешним ключом, тогда вы вообще не хотите, чтобы он был с автоматическим приращением.

3 голосов
/ 11 мая 2014

Ответ выше говорит о том, что в SQLite нет ключевого слова автоинкремента. Это неверно Есть ключевое слово, называемое «автоинкремент», и я использовал его в первичном ключе.

Например:

   static final String CREATE_LOCATION_TABLE="CREATE TABLE Location"+
            "( LocationID INTEGER PRIMARY KEY AUTOINCREMENT," +
            " RestuarantID int not null," +
            " Latitude float not null," +
            " Longitude float not null)";

Также убедитесь, что при вводе данных в эту таблицу используйте ключевое слово 'null' вместо первичного ключа.

Как это:

   static final String INSERT_LOCATION= "Insert into Location values" +
            "(null,1002,6.905369,79.851514)";
1 голос
/ 29 сентября 2011

Три вещи:

  • Снять трейлинг; из заявлений.
  • Добавить ограничение "первичный ключ" в столбец автоинкремента
  • Удалите автоинкремент из колонок ПК - это произойдет автоматически.
0 голосов
/ 30 января 2016
sqlite> CREATE TABLE app (a INTEGER PRIMARY KEY NOT NULL, B VARCHAR);
sqlite> insert into app (b) values ('');
sqlite> insert into app (b) values ('a');
sqlite> 
sqlite> insert into app (b) values ('b');
sqlite> insert into app (b) values ('c');
sqlite> insert into app (b) values ('d');
sqlite> select * from app;
1|
2|a
3|b
4|c
5|d
sqlite> exit;

ПРИМЕЧАНИЕ: В SQLite нет ключевого слова AUTOINCREMENT. Итак, вы должны просто использовать INTEGER PRIMARY KEY NOT NULL. Он автоматически вставит увеличенное значение для атрибута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...