java - 你能在 Android Studio 的 SQLite 中创建你自己的 Enum 类型吗?

标签 java android sqlite android-sqlite

你好,我正在使用 Java 在 Android Studio 上开发一个管理餐厅项目,因为我有6 种类别,我想将它们分组到一个特定的像在 MySQL Enum 中一样输入我的 Database table 类型,当然以后可以访问它们。
这是我在 Java 上的表代码,我使用 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 数据类型,但即使有也不是定义此列的最佳方式。
如果要添加新类别怎么办?您必须在表的定义中重新定义枚举值,这在 SQLite 中是不可能的,除非您重新创建表(如您所见 here )。

在这种情况下,正确的设计是创建一个表 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);
}

现在,在 restaurants 表的 id_category 列中,您将存储 ID,这些 ID 是对 categories 表中类别的引用。
您可以毫无问题地在 categories 中添加新类别。

当您查询表 restaurants 并且您想要检索每一行的类别时,您必须连接 2 个表:

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 的 SQLite 中创建你自己的 Enum 类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65443897/

相关文章:

android - NotificationCompat.Builder 缺少 build() 方法

android - 带有额外变量的 gson 数组反序列化

java - 关闭应用程序按钮监听器

java - 如何在 @test.enabled 属性中给出运行时值

java - 向后播放 WAV 文件

android - 请解释一下Android权限保护_签名解释

java - 在 Spring @Transactional 中保存多个实体的 JPA 不回滚并启用 Exception.class 回滚

laravel - 使用 phpunit.xml、.env.dusk.local 和 sqlite 内存数据库在 Dusk 中设置 Laravel 5.4

sql - 是否有一个命令结合了 SQL 中 UNION 和 JOIN 的功能?

android - 如何使用一个按钮在从 sqlite 数据库中添加和删除数据之间切换?