【问题标题】:integer primary key not autoincrementing整数主键不自动递增
【发布时间】:2012-03-13 19:53:58
【问题描述】:

我有一个关于 SQLite 和整数主键自动增量字段的问题。 我知道我可以通过调用 ROWID 列获得 id,但我需要一个 '_id' 列。

这是我创建表的查询:

private static final String TABLE_FACEBOOK_IMPORTED_CONTACTS = "facebook_imported_contacts";
    private static final String COL_ID = "_id";
    private static final String COL_FACEBOOK_ID = "facebookId";
    private static final String COL_PHONE_CONTACT_ID = "phoneContactId";
    private static final String COL_FIRST_NAME = "firstName";
    private static final String COL_LAST_NAME= "lastName";
    private static final String COL_BIRTH_DATE = "birthDate";
    private static final String COL_GROUP = "contactGroup";
    private static final String COL_MAIL_ADDRESS = "mailAddress";
    private static final String COL_PHONE_NUMBER = "phoneNumber";



    public static final String CREATE_FACEBOOK_IMPORT_BDD = "" +
            "CREATE TABLE "+TABLE_FACEBOOK_IMPORTED_CONTACTS+" ("+
            COL_ID + " integer primary key autoincrement," +
            COL_FACEBOOK_ID +" INT," +
            COL_PHONE_CONTACT_ID +" INT, " +
            COL_FIRST_NAME +" TEXT NOT NULL," +
            COL_LAST_NAME +" TEXT NOT NULL, " +
            COL_BIRTH_DATE +" TEXT," +
            COL_GROUP +" TEXT," +
            COL_MAIL_ADDRESS +" TEXT," +
            COL_PHONE_NUMBER +" TEXT);";

所以我没有错误消息。除了... COL_ID 字段 (_id) 不会自动递增之外,一切正常。 以下是其余代码:

 public class FacebookContactDAO {
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "automatic_sms.db";

    private static final String TABLE_FACEBOOK_IMPORTED_CONTACTS = "facebook_imported_contacts";
    private static final String COL_ID = "_id";
    private static final int NUM_COL_ID = 0;

    private static final String COL_FACEBOOK_ID = "facebookId";
    private static final int NUM_COL_FACEBOOK_ID = 1;

    private static final String COL_PHONE_CONTACT_ID = "phoneContactId";
    private static final int NUM_COL_PHONE_CONTACT_ID = 2;

    public static final String COL_FIRST_NAME = "firstName";
    private static final int NUM_COL_FIRST_NAME = 3;

    public static final String COL_LAST_NAME= "lastName";
    private static final int NUM_COL_LAST_NAME = 4;

    private static final String COL_BIRTH_DATE = "birthDate";
    private static final int NUM_COL_BIRTH_DATE = 5;

    private static final String COL_GROUP = "contactGroup";
    private static final int NUM_COL_GROUP = 6;

    private static final String COL_MAIL_ADDRESS = "mailAddress";
    private static final int NUM_COL_MAIL_ADDRESS = 7;

    private static final String COL_PHONE_NUMBER = "phoneNumber";
    private static final int NUM_COL_PHONE_NUMBER = 8;

    private SQLiteDatabase database;
    private SQLiteDB mySQLiteDB;



    public FacebookContactDAO(Context context){
        //On créer la BDD et sa table
        mySQLiteDB = new SQLiteDB(context, DB_NAME, null, DB_VERSION);
    }

    public void open(){
        database = mySQLiteDB.getWritableDatabase();
        //database.execSQL("DROP TABLE " + TABLE_FACEBOOK_IMPORTED_CONTACTS + ";");
        //database.execSQL(SQLiteDB.CREATE_FACEBOOK_IMPORT_BDD);
    }

    public void close(){
        database.close();
    }

    public SQLiteDatabase getDB(){
        return database;
    }

    public long insert(FacebookContact contact){


        ContentValues contactValues = new ContentValues();

        contactValues.put(COL_FACEBOOK_ID, contact.getFacebookId());
        contactValues.put(COL_PHONE_CONTACT_ID, contact.getPhoneContactId());
        contactValues.put(COL_FIRST_NAME, contact.getFirstName());
        contactValues.put(COL_LAST_NAME, contact.getLastName());
        contactValues.put(COL_BIRTH_DATE, contact.getBirthDate());
        contactValues.put(COL_GROUP, contact.getGroup());
        contactValues.put(COL_MAIL_ADDRESS, contact.getMailAddress());
        contactValues.put(COL_PHONE_NUMBER, contact.getPhoneNumber());

        return database.insert(TABLE_FACEBOOK_IMPORTED_CONTACTS, null, contactValues);
    }

    public int update(int id, FacebookContact contact){
        ContentValues contactValues = new ContentValues();
        //contactValues.put(COL_ID, contact.getId()); // (shouldn't be able to change the id)
        contactValues.put(COL_FACEBOOK_ID, contact.getFacebookId());
        contactValues.put(COL_PHONE_CONTACT_ID, contact.getPhoneContactId());
        contactValues.put(COL_FIRST_NAME, contact.getFirstName());
        contactValues.put(COL_LAST_NAME, contact.getLastName());
        contactValues.put(COL_BIRTH_DATE, contact.getBirthDate());
        contactValues.put(COL_GROUP, contact.getGroup());
        contactValues.put(COL_MAIL_ADDRESS, contact.getMailAddress());
        contactValues.put(COL_PHONE_NUMBER, contact.getPhoneNumber());

        return database.update(TABLE_FACEBOOK_IMPORTED_CONTACTS, contactValues, COL_ID + " = " +id, null);
    }

    public int remove(long facebookId){
        //Suppression d'un livre de la BDD grâce à l'ID
        return database.delete(TABLE_FACEBOOK_IMPORTED_CONTACTS, COL_FACEBOOK_ID + " = " +facebookId, null);
    }
    public int removeEverything(){
        //Suppression d'un livre de la BDD grâce à l'ID
        return database.delete(TABLE_FACEBOOK_IMPORTED_CONTACTS, "1 = 1", null);
    }

    public FacebookContact getByFacebookId(long facebookId) {

        Cursor queryResult = database.query(    TABLE_FACEBOOK_IMPORTED_CONTACTS,
                                    new String[] {COL_ID,COL_FACEBOOK_ID, COL_PHONE_CONTACT_ID, COL_FIRST_NAME,COL_LAST_NAME,COL_BIRTH_DATE,COL_GROUP,COL_MAIL_ADDRESS,COL_PHONE_NUMBER},
                                    COL_FACEBOOK_ID + " = " + facebookId + "",
                                    null, null, null, null);
        FacebookContact contact = cursorToFacebookContact(queryResult);
        queryResult.close();

        return contact;
    }

    public Cursor getAll() {

        Cursor queryResult = database.query(    TABLE_FACEBOOK_IMPORTED_CONTACTS,
                                    new String[] {COL_ID,COL_FACEBOOK_ID, COL_PHONE_CONTACT_ID, COL_FIRST_NAME,COL_LAST_NAME,COL_BIRTH_DATE,COL_GROUP,COL_MAIL_ADDRESS,COL_PHONE_NUMBER},
                                    "1",
                                    null, null, null, COL_LAST_NAME+","+COL_FIRST_NAME);

        //FacebookContact contact = cursorToFacebookontact(queryResult);
        //queryResult.close();
        return queryResult;
    }


    private FacebookContact cursorToFacebookContact(Cursor c){
        if (c.getCount() == 0)
            return null;

        c.moveToFirst();

        FacebookContact contact = new FacebookContact();

        contact.setId(c.getInt(NUM_COL_ID));
        contact.setFacebookId(c.getInt(NUM_COL_FACEBOOK_ID));
        contact.setPhoneContactId(c.getInt(NUM_COL_PHONE_CONTACT_ID));
        contact.setFirstName(c.getString(NUM_COL_FIRST_NAME));
        contact.setLastName(c.getString(NUM_COL_LAST_NAME));
        contact.setBirthDate(c.getString(NUM_COL_BIRTH_DATE));
        contact.setGroup(c.getString(NUM_COL_GROUP));
        contact.setMailAddress(c.getString(NUM_COL_MAIL_ADDRESS));
        contact.setPhoneNumber(c.getString(NUM_COL_PHONE_NUMBER));

        c.close();

        return contact;
    }

}

也许问题来自私人 FacebookContact cursorToFacebookContact。

如果您需要任何信息,请告诉我!

提前致谢

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    移除自动增量

    确保您的模型类具有变量以及 get 和 set 方法

    --在模态类中---

     public int getId(){
          return this._id;
        }
    
    
    public void setId(int id){
            this._id= id;
        }
    

    这两种方法在你的模型类中是强制的

    看看你的 Table 是不是像下面的 SQL 代码那样创建的:

    private static final String CREATE_CATEGORY_TABLE=
                "CREATE TABLE "+CATEGORY_TABLE+"("
                        +CAT_ID+" INTEGER PRIMARY KEY ,  "
                        +CATEGORY+" TEXT, "
                        + DESCRIPTION+" TEXT, "
                        +CAT_TYPE+" TEXT)";
    

    我有CAT_ID= _id declared;

    您无需在 DatabaseManager 的 add 方法中添加该字段。

    但您需要在从数据库管理器返回值列表时设置 id 喜欢;

    public ArrayList<Category> getCategory(){
            ArrayList<Category> listofCat= new ArrayList<Category>();
            String selquery="SELECT * FROM "+CATEGORY_TABLE;
            SQLiteDatabase db= this.getReadableDatabase();
            Cursor cursor= db.rawQuery(selquery,null);
    
            if(cursor.moveToFirst()){
                do{
                    Category category= new Category();
                    category.setId(cursor.getInt(cursor.getColumnIndex(CAT_ID)));
                    category.setCatName(cursor.getString(cursor.getColumnIndex(CATEGORY)));
                    category.setCatDesc(cursor.getString(cursor.getColumnIndex(DESCRIPTION)));
                    category.setCatType(cursor.getString(cursor.getColumnIndex(CAT_TYPE)));
    
                    listofCat.add(category);
                }while (cursor.moveToNext());
    
            }
            cursor.close();
            return listofCat;
    

    此方法返回我的上下文中的类别列表。

    以这种方式重新排列您的代码,它将起作用。

    【讨论】:

      【解决方案2】:

      我认为您的 autoincrement 关键字需要一个下划线,例如:auto_increment

      【讨论】:

        猜你喜欢
        • 2013-06-07
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 2013-09-28
        • 2017-02-10
        • 1970-01-01
        • 2018-12-10
        • 2011-07-06
        相关资源
        最近更新 更多