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

时间:2011-09-29 08:34:06

标签: android sqlite

 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:ERROR / Database(334):失败1(近   准备'创建时,在0x218df0上的“自动增量”:语法错误)   表MY_TABLE2(_id2整数自动增量,Content2文本不为空,   Content3 text not null,FOREIGN KEY(_id2)REFERENCES 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:ERROR / AndroidRuntime(334):致命异常:主

     

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

5 个答案:

答案 0 :(得分:37)

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

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

编辑:只需撰写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);
        }

答案 1 :(得分:8)

此:

+ KEY_ID2 + " integer autoincrement, " 

应该是这样的:

+ KEY_ID2 + " integer primary key autoincrement, " 

如果您按照CREATE TABLE的语法图表进行操作,您会发现autoincrement应该只在primary key之后。

enter image description here enter image description here

如果您希望_id2成为外键,那么您根本不希望它自动增加。

答案 2 :(得分:3)

上面的答案说'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)";

答案 3 :(得分:1)

三件事:

  • 删除尾随;来自陈述。
  • 将“主键”约束添加到自动增量列
  • 从PK列中删除自动增量 - 它会自动发生。

答案 4 :(得分:0)

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。它将自动插入属性的递增值。