android.database.sqlite.SQLiteException: near "group": syntax error (code 1)

首先我們來看一段創(chuàng)建數(shù)據(jù)庫的代碼:

  • 數(shù)據(jù)庫字段表GroupDbSchema.java
public class GroupDbSchema {    
    public static final class GroupTable {       
        public static final String NAME = "group";        
        
        public static final class COLS {            
            public static final String UUID = "uuid";            
            public static final String TITLE = "title";            
            public static final String TYPE = "type";        
        }        
            
       public static final String SQL_CREATE_TABLE = "CREATE TABLE " + NAME + "(" +                
              "_id INTEGER PRIMARY KEY AUTO_INCREMENT, " +
              COLS.UUID + " TEXT NOT NULL, " +
              COLS.TITLE + " TEXT NOT NULL, " +
              COLS.TYPE + " BYTE" + ")";                                                        
    }
}
  • 創(chuàng)建數(shù)據(jù)庫MyDatabaseHelper.java
public class MyDatabaseHelper extends SQLiteOpenHelper {    
  
    private static final int DB_VERSION = 1;    
    private static final String DB_NAME = "test.db";    
    
    public MyDatabaseHelper(Context context) {        
        super(context, DB_NAME, null, DB_VERSION);    
    }    

    @Override    
    public void onCreate(SQLiteDatabase db) {        
        db.execSQL(GroupTable.SQL_CREATE_TABLE);    
    }    

    @Override    
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    }
}

那么上面這段創(chuàng)建數(shù)據(jù)的代碼有什么問題呢?我們把項目部署到真機上進(jìn)行測試,發(fā)現(xiàn)系統(tǒng)拋出了一個異常:

android.database.sqlite.SQLiteException: near "group": syntax error (code 1): , while compiling: CREATE TABLE group(_id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT NOT NULL, title TEXT NOT NULL, type BYTE)

仔細(xì)檢查創(chuàng)建數(shù)據(jù)庫的語句發(fā)現(xiàn)并沒有什么錯誤,那系統(tǒng)為什么會拋出異常呢?通過在網(wǎng)上查閱相關(guān)資料之后找到了問題的答案,group是SQLite數(shù)據(jù)庫中的一個關(guān)鍵字,不能用作表的名稱,所以在使用group作為表名稱時系統(tǒng)會拋出異常。

參考鏈接:android.database.sqlite.SQLiteException: near “Group”: syntax error (code 1)

了解異常出現(xiàn)的原因之后,我們修改表的名稱之后再運行一次項目:

- public static final String NAME = "group";
+ public static final String NAME = "test_group";

結(jié)果系統(tǒng)又拋出了一個異常:

android.database.sqlite.SQLiteException: near "AUTO_INCREMENT": syntax error (code 1)
這又是什么鬼?

既然異常提示跟AUTO_INCREMENT可能有關(guān)系,那么我們就來看看AUTO_INCREMENT字段,查看一下W3CSchool對該字段的解釋SQL AUTO INCREMENT 字段,心想我也沒有拼錯啊,怎么就又拋了個異常呢?查看網(wǎng)上相關(guān)的資料發(fā)現(xiàn)大家在創(chuàng)建數(shù)據(jù)使用AUTO_INCREMENT字段時,字段之間并沒有"_",一般都是AUTOINCREMENT。那么我們就去掉下劃線再運行一次試試,發(fā)現(xiàn)這一次數(shù)據(jù)庫可以正常創(chuàng)建了。

雖然問題解決了,但是按照W3CSchool對AUTO_INCREMENT字段的解釋,使用AUTO_INCREMENT應(yīng)該不會拋出異常啊,為什么在手機中測試時會拋出異常呢?會不會是因為手機自身的原因?那么我們就在模擬器上再測試看看會不會出現(xiàn)相同的情況。打開Android Studio中的模擬器將項目部署到模擬器上進(jìn)行測試,發(fā)現(xiàn)系統(tǒng)這次也拋出了異常,提示程序停止運行。雖然拋出的異常和在真機上測試拋出的異常不同,但可以證明這是AUTO_INCREMENT字段的問題,跟手機的型號無關(guān),正確的方法是使用AUTOINCREMENT字段。

總結(jié):

  • group在SQLite數(shù)據(jù)庫中是特殊的字段,不能用作表的名稱
  • Android中自增長應(yīng)該使用AUTOINCREMENT字段而不是AUTO_INCREMENT

2017-05-31 更新

Android使用的是SQLite3數(shù)據(jù)庫,SQLite3數(shù)據(jù)庫中自增長字段為AUTOINCREMENT,并且關(guān)鍵字 AUTOINCREMENT 只能用于整型(INTEGER)字段。

SQLite相關(guān)教程: SQLite教程 | 菜鳥教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,823評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,688評論 19 139
  • 工具:Android Studio,XMind,馬克飛象,印象筆記 2016年12月8日,Google中國開發(fā)者大...
    Gunther閱讀 1,170評論 0 6
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,031評論 0 11
  • 有一個人從小就長得特別矮小,但是他非常喜愛籃球,幾乎天天和同伴們在籃球場上揮汗如雨。當(dāng)時,他就夢想有一天能雄糾糾氣...
    王虎林閱讀 441評論 0 2

友情鏈接更多精彩內(nèi)容