【问题标题】:Error while using autoincrement keyword in sqlite在 sqlite 中使用 autoincrement 关键字时出错
【发布时间】:2012-01-02 08:12:20
【问题描述】:

您好,我正在开发安卓应用程序,现在我必须使用 sqlite 数据库在手机中存储一些数据。现在,当我创建没有自动增量关键字的数据库时。但是当我使用这个关键字时,错误就来了,上面写着

"java.lang.RuntimeException: 无法启动活动 组件信息{abc.tt/abc.tt.Home}: android.database.sqlite.SQLiteException:接近“自动增量”:语法 错误:创建表 calSimpleNote(_id 整数 PRIMERY KEY 自动增量 , Cal_Id TEXT , User_ID INTEGER , Cal_Date TEXT , 注意 TEXT,涉及者 TEXT, DeleteReason TEXT ,Create_Date TEXT ,Changed_date TEXT,EmailInvolvers TEXT,RemindSameDay INTEGER, RemindAllDay INTEGER,RemindBeforeDays INTEGER );" .

Here is my code to create database. 创建数据库时出现错误。如果有人有任何想法,请帮助我。谢谢。

我已使用以下链接作为参考。This

我正在使用此代码插入,但我没有递增。

public long insertCalSimpleNote(String noteId,int userId,String cal_date,String note,String Involved,String DeleteReason,String Create_Date, String Changed_date,String emailInvolvers,intremindSameday,intremindAllday,intremindBeforeday){

    ContentValues initialValues = new ContentValues();

    initialValues.put("_Id", 0);
    initialValues.put("Cal_Id", noteId);
    initialValues.put("User_ID", userId);
    initialValues.put("Cal_Date", cal_date);
    initialValues.put("Note", note);
    initialValues.put("Involvers", Involved);
    initialValues.put("DeleteReason", DeleteReason);
    initialValues.put("Create_Date", Create_Date);
    initialValues.put("Changed_date", Changed_date);
    initialValues.put("EmailInvolvers", emailInvolvers);
    initialValues.put("RemindSameDay", remindSameday);
    initialValues.put("RemindAllDay", remindAllday);
    initialValues.put("RemindBeforeDays", remindBeforeday);

    return db.insert("calSimpleNote", null, initialValues);
}

It set 0 at every row.

//Create Table
private static final String CREATE_SIMPLENOTE = "create table calSimpleNote (_id integer PRIMERY KEY, Cal_Id TEXT , User_ID INTEGER , Cal_Date TEXT , Note TEXT,Involvers TEXT, "+
                                                "DeleteReason TEXT ,Create_Date TEXT ,Changed_date TEXT,EmailInvolvers TEXT, "+ 
                                                "RemindSameDay INTEGER, RemindAllDay INTEGER,RemindBeforeDays INTEGER );"; 
@Override
    public void onCreate(SQLiteDatabase db) 
    {
        db.execSQL(CREATE_SIMPLENOTE);
    }

【问题讨论】:

  • 此行不是必需的:initialValues.put("_Id", 0)
  • 我已将其删除。但是没有插入任何值。它只插入“”。

标签: android sqlite


【解决方案1】:

声明为 INTEGER PRIMARY KEY 的列将自动递增。

我从here偷来的:

简短回答:声明为 INTEGER PRIMARY KEY 的列将 自动增量。

这是一个长答案:如果你声明一个表的列是 INTEGER PRIMARY KEY,然后每当您将 NULL 插入该列时 表中,NULL 自动转换为整数 比该列的最大值大一 表中的其他行,如果表为空,则为 1。 (如果最大 可能的整数键,9223372036854775807,则未使用的键值为 随机选择。)例如,假设您有一个这样的表:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

有了这张表,声明

INSERT INTO t1 VALUES(NULL,123);

在逻辑上相当于说:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

【讨论】:

    【解决方案2】:

    试试这个:

    //Create Table
    private static final String CREATE_SIMPLENOTE = "create table calSimpleNote (_id integer primary key autoincrement, Cal_Id TEXT , User_ID INTEGER , Cal_Date TEXT , Note TEXT,Involvers TEXT, "+
                                                    "DeleteReason TEXT ,Create_Date TEXT ,Changed_date TEXT,EmailInvolvers TEXT, "+ 
                                                    "RemindSameDay INTEGER, RemindAllDay INTEGER,RemindBeforeDays INTEGER );";
    

    &这个:

    public long insertCalSimpleNote(String noteId,int userId,String cal_date,String note,String Involved,String DeleteReason,String Create_Date, String Changed_date,String emailInvolvers,int remindSameday,int remindAllday,int remindBeforeday){
    
        ContentValues initialValues = new ContentValues();
    
    
        initialValues.put("Cal_Id", noteId);
        initialValues.put("User_ID", userId);
        initialValues.put("Cal_Date", cal_date);
        initialValues.put("Note", note);
        initialValues.put("Involvers", Involved);
        initialValues.put("DeleteReason", DeleteReason);
        initialValues.put("Create_Date", Create_Date);
        initialValues.put("Changed_date", Changed_date);
        initialValues.put("EmailInvolvers", emailInvolvers);
        initialValues.put("RemindSameDay", remindSameday);
        initialValues.put("RemindAllDay", remindAllday);
        initialValues.put("RemindBeforeDays", remindBeforeday);
    
        return db.insert("calSimpleNote", null, initialValues);
    }
    

    【讨论】:

      【解决方案3】:

      SQLite 中没有 autoincrement 关键字,这就是您收到错误消息的原因。

      声明为INTEGER PRIMARY KEY 的列将自动递增。

      如果您将表的列声明为INTEGER PRIMARY KEY,那么每当您在表的该列中插入 NULL 时,NULL 都会自动转换为比该列的最大值大 1 的整数表中的所有其他行,如果表为空,则为 1。例如:

      CREATE TABLE mytable(
        column1 INTEGER PRIMARY KEY,
        column2 INTEGER
      );
      

      这里的 column1 是自动递增的。

      【讨论】:

      • 一种你可以尝试的方法只是测试。插入第一行,明确指定要开始的行 ID。然后 SQLite 将插入高于前一个最高值的行 ID。
      【解决方案4】:

      SQLite 没有自动增量选项。

      你可以:

      1) 创建一个 INTEGER PRIMARY KEY 类型的列(它将自动递增) 2) 创建一个名为 ROWID 的列,并在插入时将其设为 null。 3)创建您自己的并通过您的代码实现自动增量选项(不推荐)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-27
        • 2014-03-05
        • 2019-03-13
        • 1970-01-01
        • 2015-10-08
        • 2017-01-26
        • 2023-01-27
        • 1970-01-01
        相关资源
        最近更新 更多