Android表创建失败(接近“自动增量”:语法错误)?

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):在准备’create table MY_TABLE2时,在0x218df0上失败1(接近“自动递增”:语法错误)(_id2整数自动递增,Content2文本不为null,Content3文本不为null, FOREIGN KEY(_id2)REFERENCES MY_TABLE(_id));’。

09-29 13:41:19.770:DEBUG / AndroidRuntime(334):关闭VM

09-29 13:41:19.770:WARN / dalvikvm(334):threadid = 1:线程退出时未捕获exception(group = 0x4001d800)

09-29 13:41:19.791:ERROR / AndroidRuntime(334):致命exception:主要

09-29 13:41:19.791:ERROR / AndroidRuntime(334):java.lang.RuntimeException:无法启动活动ComponentInfo {sep.com/sep.com.SepActivity}:android.database.sqlite.SQLiteException:near“autoincrement “:语法错误:创建表MY_TABLE2(_id2整数自动增量,Content2文本不为空,Content3文本不为空,FOREIGN KEY(_id2)REFERENCES MY_TABLE(_id));

简而言之: In SQLite a column declared INTEGER PRIMARY KEY will autoincrement. SQLite中没有autoincrement关键字,这就是您收到错误的原因。

您可以在SQLite FAQ上find更多信息。

编辑:只需编写integer primary keySQLite会自动增加你的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); } 

这个:

 + KEY_ID2 + " integer autoincrement, " 

应该是这样的:

 + KEY_ID2 + " integer primary key autoincrement, " 

如果您按照CREATE TABLE的语法图表,您将看到autoincrement应该仅在primary key

在此处输入图像描述在此处输入图像描述

如果你想让_id2成为一个外键,那么你根本不希望它自动增加。

上面的答案说“SQLite中没有自动增量关键字”。 这是不正确的。 有一个名为’autoincrement’的关键字,我在主键中使用它。

例如:

  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)"; 

三件事:

  • 去掉尾随; 从声明。
  • 将“主键”约束添加到自动增量列
  • 从PK列中删除自动增量 – 它会自动发生。
 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 。 它将自动插入属性的递增值。