SQLite在Android上的关系表

8

你能帮我解决sqlite中两个表之间的关系问题吗?

我已经完成了插入、删除和更新步骤,但现在我需要支持两个表之间的关系。我猜以前完成的所有代码步骤都会改变,对吗?你有没有任何链接或例子可以解释表之间的关系以及关系后的任何活动?

3个回答

21
为了建立两个表之间的关系,您可以使用外键。 外键是关系表中与另一个表的候选键匹配的字段。
例如,假设我们有两个表,一个包括所有客户数据的CUSTOMER表和一个包括所有客户订单的ORDER表。 这里的意图是所有订单必须与已经在CUSTOMER表中的客户相关联。 为此,我们将在ORDER表中放置一个外键,并将其与CUSTOMER表的主键相关联。
SQLite Foreign Key Constraints中,可以按以下方式添加外键约束:
编辑: 您可以像这样设计item_order表:
CREATE TABLE customer(
         id INTEGER,
         firstName TEXT,
         middleName TEXT,
         lastName   TEXT,
         address TEXT,
         contactNum TEXT
);

 CREATE TABLE item(
        id INTEGER,
        name TEXT,
        description TEXT
 );

 CREATE TABLE order(
        id INTEGER,
        customerID INTEGER,
        date TEXT,
        FOREIGN KEY(customerId) REFERENCES customer(id)
 );

 CREATE TABLE item_order(
        id INTEGER,
        orderID INTEGER,
        itemId  INTEGER,
        quantity INTEGER,
        FOREIGN KEY(orderId) REFERENCES order(Id),
        FOREIGN KEY(itemId) REFERENCES item(Id)
 );

在这一步之后,我该如何插入一个订单表项。因为许多客户有许多订单。要插入订单,我该如何访问订单表。 - user1417278
通常情况下,我使用以下代码而不涉及任何关系。private void insertkisi(String name, String email, String pword) {SQLiteDatabase db = vnesne.getWritableDatabase();ContentValues cv = new ContentValues(); cv.put(Veritabani.colName, name); cv.put(Veritabani.colAge, email); cv.put(Veritabani.colDept, pword);db.insert("kisi", null, cv); db.close(); } - user1417278
@user1417278,请注意编辑,您用于插入没有关联的值的代码仍然可以使用,直到您不违反外键约束为止。 - Eight
谢谢你的一切。你有关于插入、删除和更新代码部分的任何想法吗?就像我之前提到的,我已经完成了所有的删除、更新和插入操作,但在关系之后,我不知道如何实现删除、更新和插入查询。如果你能帮忙,我会很高兴的。 - user1417278
@user1417278 插入值时,请使用之前相同的代码,只需注意外键约束,这意味着如果您要在订单表中插入一个值,则其对应的客户ID必须存在于客户表中。因此,在插入时,首先在客户和项目表中插入,然后在订单和item_order表中插入。同样,在删除客户条目时,首先从订单和item_order表中删除该客户的所有条目,然后才能从客户表中删除条目。 - Eight

2

优秀的示例 http://www.androidhive.info/2013/09/android-sqlite-database-with-multiple-tables/

这个示例展示了如何在Android应用中使用SQLite数据库,并创建多个表格。它包含完整的代码和详细的解释,可以帮助开发人员快速学习和实现。

// Table Create Statements
// Todo table create statement
private static final String CREATE_TABLE_TODO = "CREATE TABLE "
        + TABLE_TODO + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TODO
        + " TEXT," + KEY_STATUS + " INTEGER," + KEY_CREATED_AT
        + " DATETIME" + ")";

// Tag table create statement
private static final String CREATE_TABLE_TAG = "CREATE TABLE " + TABLE_TAG
        + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TAG_NAME + " TEXT,"
        + KEY_CREATED_AT + " DATETIME" + ")";

// todo_tag table create statement
private static final String CREATE_TABLE_TODO_TAG = "CREATE TABLE "
        + TABLE_TODO_TAG + "(" + KEY_ID + " INTEGER PRIMARY KEY,"
        + KEY_TODO_ID + " INTEGER," + KEY_TAG_ID + " INTEGER,"
        + KEY_CREATED_AT + " DATETIME" + ")";

选择所有的待办事项(todos),标签(tags)和待办事项与标签之间的关系(todo_tags),其中标签名称为“Watchlist”,且标签ID等于待办事项与标签之间关系的标签ID,待办事项ID等于待办事项与标签之间关系的待办事项ID。

/*
 * getting all todos under single tag
 * */
public List<Todo> getAllToDosByTag(String tag_name) {
    List<Todo> todos = new ArrayList<Todo>();

    String selectQuery = "SELECT  * FROM " + TABLE_TODO + " td, "
            + TABLE_TAG + " tg, " + TABLE_TODO_TAG + " tt WHERE tg."
            + KEY_TAG_NAME + " = '" + tag_name + "'" + " AND tg." + KEY_ID
            + " = " + "tt." + KEY_TAG_ID + " AND td." + KEY_ID + " = "
            + "tt." + KEY_TODO_ID;

    Log.e(LOG, selectQuery);

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (c.moveToFirst()) {
        do {
            Todo td = new Todo();
            td.setId(c.getInt((c.getColumnIndex(KEY_ID))));
            td.setNote((c.getString(c.getColumnIndex(KEY_TODO))));
            td.setCreatedAt(c.getString(c.getColumnIndex(KEY_CREATED_AT)));

            // adding to todo list
            todos.add(td);
        } while (c.moveToNext());
    }

    return todos;
}

-2
我猜你应该读一本关于基本SQL数据库编程的书籍或网站。通过将一个表的键(或字段)添加到另一个表中,您可以创建两个表之间的关系。但是,真正的情况是,您应该先熟悉SQL。在您完成这项任务后,您可以创建关系,或者您会发现使用Ormlite很方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接