您可以在 Android Studio 的 SQLite 中创建自己的枚举类型吗?
Can you create your own Enum type in SQLite in Android Studio?
您好,我正在使用 Java 在 Android Studio 上进行 Management Restaurants 项目,因为我有 6 种类型的类别 ,我想将它们分组到我的 Database table
中的特定类型,就像我们在 MySQL Enum
类型中所做的那样,当然以后可以访问它们。
这是我在 Java 上的 table 代码,我使用 SQLite
作为数据库:
public static final String CREATE_RESTAURANT_TABLE_ =
"CREATE TABLE " + RESTAURANT_TABLE + "(" +
ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
NAME + " TEXT " +
CITY + " TEXT " +
CATEGORY + "TEXT" +
PHONE_NUMBER + "TEXT" +
LAT + "TEXT" +
LON + " TEXT );";
SQLite 中没有 ENUM
数据类型,但即使有,也不是定义此列的最佳方式。
如果要添加新类别怎么办?您必须在 table 的定义中重新定义枚举值,这在 SQLite 中是不可能的,除非您重新创建 table(如您所见 here)。
在这种情况下,正确的设计是创建一个 table 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
class 中,您必须像这样覆盖 onConfigure()
来启用外键约束:
@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
}
现在,在餐厅 table 的 id_category
列中,您将存储 ID,这些 ID 是对您在 categories
table 中拥有的类别的引用。
您可以在 categories
中添加新类别,没有任何问题。
当您查询 table 家餐厅并且想要检索每一行的类别时,您必须加入 2 tables:
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
您好,我正在使用 Java 在 Android Studio 上进行 Management Restaurants 项目,因为我有 6 种类型的类别 ,我想将它们分组到我的 Database table
中的特定类型,就像我们在 MySQL Enum
类型中所做的那样,当然以后可以访问它们。
这是我在 Java 上的 table 代码,我使用 SQLite
作为数据库:
public static final String CREATE_RESTAURANT_TABLE_ =
"CREATE TABLE " + RESTAURANT_TABLE + "(" +
ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
NAME + " TEXT " +
CITY + " TEXT " +
CATEGORY + "TEXT" +
PHONE_NUMBER + "TEXT" +
LAT + "TEXT" +
LON + " TEXT );";
SQLite 中没有 ENUM
数据类型,但即使有,也不是定义此列的最佳方式。
如果要添加新类别怎么办?您必须在 table 的定义中重新定义枚举值,这在 SQLite 中是不可能的,除非您重新创建 table(如您所见 here)。
在这种情况下,正确的设计是创建一个 table 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
class 中,您必须像这样覆盖 onConfigure()
来启用外键约束:
@Override
public void onConfigure(SQLiteDatabase db) {
db.setForeignKeyConstraintsEnabled(true);
}
现在,在餐厅 table 的 id_category
列中,您将存储 ID,这些 ID 是对您在 categories
table 中拥有的类别的引用。
您可以在 categories
中添加新类别,没有任何问题。
当您查询 table 家餐厅并且想要检索每一行的类别时,您必须加入 2 tables:
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