gpt4 book ai didi

android - 在sqlite中用外键连接两个表

转载 作者:行者123 更新时间:2023-11-30 04:58:55 24 4
gpt4 key购买 nike

您好,在我的 senario 中有一个包含 4 列的表,我正在尝试创建另一个连接到第一个表的表,但我不知道我在 logcat 中收到此错误

2019-10-28 01:04:00.853 29812-29812/com.test.fastfoodfinder E/SQLiteDatabase: Error inserting notes_main=testeststststststststs
android.database.sqlite.SQLiteException: no such table: notes (code 1 SQLITE_ERROR): , while compiling: INSERT INTO notes(notes_main) VALUES (?)

所以我为我的数据库创建了一个类,这就是我所做的

public class RestaurantDBHelper extends SQLiteOpenHelper {

private final static String DATABASE_NAME = "FastFood_DataBase.db";
private final static int DATABASE_VERSION = 1;



private final static String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
"(" + COLUMN_RESTAURANT_ID + " INTEGER PRIMARY KEY ," +
COLUMN_RESTAURANT_NAME + " TEXT, " +
COLUMN_RESTAURANT_ADDRESS + " TEXT, " +
COLUMN_RESTAURANT_TYPE + " INTEGER, " +
COLUMN_RESTAURANT_IMAGE + " INTEGER);";


private final static String CREATE_TABLE_NOTES = "CREATE TABLE " + TABLE_NAME_NOTES +
"(" + COLUMN_NOTES_ID + " INTEGER PRIMARY KEY, "
+ COLUMN_NOTES + " TEXT," + "FOREIGN KEY (" + COLUMN_NOTES_ID + ") REFERENCES " + TABLE_NAME +"(restaurant_id) ON DELETE CASCADE)";


public final static String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;

public RestaurantDBHelper(@Nullable Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("PRAGMA FOREIGN_KEYS = ON;");
db.execSQL(CREATE_TABLE);
db.execSQL(CREATE_TABLE_NOTES);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DELETE_TABLE);
onCreate(db);
}

public void addRestaurant(Restaurant restaurant) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();

values.put(COLUMN_RESTAURANT_NAME, restaurant.getName());
values.put(COLUMN_RESTAURANT_ADDRESS, restaurant.getAddress());
values.put(COLUMN_RESTAURANT_TYPE,restaurant.getType());
values.put(COLUMN_RESTAURANT_IMAGE, restaurant.getType());

db.insert(TABLE_NAME, null, values);

db.close();
}

public void addNotes (Restaurant restaurant) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();

values.put(COLUMN_NOTES,restaurant.getNote());

db.insert(TABLE_NAME_NOTES,null,values);

db.close();
}

public class RestaurantContract {
public static class EntryRestaurants {
public final static String TABLE_NAME = "restaurants";
public final static String COLUMN_RESTAURANT_ID = "restaurant_id";
public final static String COLUMN_RESTAURANT_NAME = "restaurant_name";
public final static String COLUMN_RESTAURANT_ADDRESS = "restaurant_address";
public final static String COLUMN_RESTAURANT_TYPE = "restaurant_type";
public final static String COLUMN_RESTAURANT_IMAGE = "restaurant_image_type";
public final static String COLUMN_RESTAURANT_NOTE_ID = "note_id";

public final static String TABLE_NAME_NOTES = "notes";
public final static String COLUMN_NOTES_ID = "notes_id";
public final static String COLUMN_NOTES = "notes_main";

public final static int RESTAURANT_TYPE_DELIVERY = 1;
public final static int RESTAURANT_TYPE_SITDOWN = 2;
public final static int RESTAURANT_TYPE_TAKEAWAY = 3;
}
}

我是 android 中的新手,所以我们将不胜感激,谢谢

最佳答案

我认为您的问题与 onCreate 方法有关。这仅在创建数据库时运行,它不会在每次运行应用程序时运行。

假设您不需要保留任何现有数据,最简单的解决方案是删除应用程序的数据或卸载应用程序。重新运行应用程序后,将创建新表,因为随后将运行 onCreate 方法。

此外,在 onCreate 方法中打开 FOREIGN KEYS 是没有用的。每次运行应用程序时都需要打开 FOREIGN KEYS。要解决此问题,请覆盖 onConfigure 方法,然后使用 db.setForeignKeyConstraintsEnabled(true);

  • 这只是使用 db.execSQL("PRAGMA FOREIGN_KEYS = ON;"); 的一种方便的替代方法,所以如果您愿意,可以在覆盖 onConfigure 方法时使用它。

例如将此方法添加到 RestaurantDBHelper 类:-

@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
}

但是,您在尝试添加注释时会遇到问题,因为子项将被设置为 null,因此它们将不是添加的注释和餐厅。

你需要使用类似的东西:-

public long addNote(String note, long restaurantId) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NOTES,note);
values.put(COLUMN_NOTES_ID,restaurantId);
return db.insert(TABLE_NAME_NOTES,null,values);
}

但是那么您可能会遇到确定餐厅 ID 的问题。

但是 那么您可能会遇到进一步的问题,因为用于引用餐厅的列被定义为 INTEGER PRIMARY KEY,因此是一个 UNIQUE 列,因此每个餐厅只能有一个注释(相同的值只能使用一次(一个异常(exception)是 null,因为一个 null 被认为对另一个 null 是唯一的))。

如果要求每个餐厅一张便条,则不需要单独的表,关系是一对一关系,因此值可以存储在餐厅表中。

如果您希望餐厅有多个注释(一对多 关系),那么您不应将列设置为 INTEGER PRIMARY KEY,INTEGER 就足够了。然后许多注释可以引用同一家餐厅。

如果您希望一条注释能够应用于许多餐馆,那么您可以使用第三个映射/线/引用/关联表(其他名称可能也存在)。这样的表格将有两列,一列引用餐厅,另一列引用注释。然后,您将在餐厅和注释之间建立多对多关系(一个注释可以被许多餐厅使用,一个餐厅可以使用多个注释)。

您可能会发现 The 3 Types of Relationships in Database Design有帮助。

关于android - 在sqlite中用外键连接两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58583667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com