在SQLite中没有
ENUM
数据类型,即使有这种类型,也不是定义这个列的最佳方式。
如果您想添加一个新类别,您必须重新定义表定义中的枚举值。在SQLite中,除非您重新创建表,否则无法实现这一点(可以在
这里找到)。
在这种情况下的正确设计是创建一个名为
categories
的表:
CREATE TABLE categories(id INTEGER PRIMARY KEY, category TEXT);
并将所有类别存储在那里:
INSERT INTO categories(category) VALUES
('category1'), ('category2'), ...., ('categoryn');
在您的RESTAURANT_TABLE
中定义一个列,它引用了categories
中的id
列:
public static final String ID_CATEGORY = "id_category";
public static final String CREATE_RESTAURANT_TABLE_ =
"CREATE TABLE " + RESTAURANT_TABLE + "(" +
ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
NAME + " TEXT," +
CITY + " TEXT," +
ID_CATEGORY + " INTEGER REFERENCES categories(id)," +
PHONE_NUMBER + " TEXT," +
LAT + " TEXT," +
LON + " TEXT);";
在你的
SQLiteOpenHelper
类中,你必须通过覆盖
onConfigure()
方法启用外键约束,如下所示:
@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
}
现在,在餐厅表的列id_category
中,您将存储引用到categories
表中的类别的ID。
您可以在categories
中添加新的类别,没有任何问题。
当您查询餐厅表并想检索每行的类别时,您必须连接这两个表:
SELECT r.id, r.name, r.city, c.category, r.phone_number, r.lat, r.long
FROM restaurants AS r INNER JOIN categories AS c
ON c.id = r.id_category