首先我們來看一段創(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教程 | 菜鳥教程