Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在SQLiteDatabase中连接两个表?_Android_Database_Sqlite_Join - Fatal编程技术网

Android 如何在SQLiteDatabase中连接两个表?

Android 如何在SQLiteDatabase中连接两个表?,android,database,sqlite,join,Android,Database,Sqlite,Join,我需要知道如何将两个表连接在一起。我不知道如何连接表,因为我是新手 我创建了AnniversaryDBAdapter.class,在其中我在一个数据库中创建了5个表。我只需要连接两个表,如join buddiesList表和likes表 下面是AnniversaryDBAdapter.class的代码 public class AnniversaryDBAdapter { private static final String DATABASE_NAME = "AllTables";

我需要知道如何将两个表连接在一起。我不知道如何连接表,因为我是新手

我创建了AnniversaryDBAdapter.class,在其中我在一个数据库中创建了5个表。我只需要连接两个表,如join buddiesList表和likes表

下面是AnniversaryDBAdapter.class的代码

public class AnniversaryDBAdapter
{

    private static final String DATABASE_NAME = "AllTables";
    private static final int DATABASE_VERSION = 2;

    private static final String CREATE_TABLE_BUDDIESLIST = " create table buddiesList(name_id integer primary key autoincrement, name text not null);";
    private static final String CREATE_TABLE_LIKES = " create table likes(name_id integer primary key autoincrement,likes text not null);";
    private static final String CREATE_TABLE_DISLIKES = " create table dislikes(name_id integer primary key autoincrement, dislikes text not null);";
    private static final String CREATE_TABLE_EVENTS = "create table events(date_id integer primary key autoincrement, name_id text not null, date text not null, title_id text not null, starttime text not null, endtime text not null);";
    private static final String CREATE_TABLE_TITLE = "create table titles(title_id integer primary key autoincrement, name text not null, image text not null);";

    private final Context context;
    private static final String TAG = "DBAdapter";

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public AnniversaryDBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }




private static class DatabaseHelper extends SQLiteOpenHelper
{

    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        db.execSQL(CREATE_TABLE_BUDDIESLIST);
        db.execSQL(CREATE_TABLE_LIKES);
        db.execSQL(CREATE_TABLE_EVENTS);
        db.execSQL(CREATE_TABLE_TITLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w(TAG, "Upgrading database from version "+oldVersion+" to "+newVersion+", which will destroy all old data");

        onCreate(db);

    }

}


public AnniversaryDBAdapter open() throws SQLException
{
    this.db = this.DBHelper.getWritableDatabase();
    return this;
}

public void close()
{
    this.DBHelper.close();
}

}

假设我们将您的表布局更正为以下内容:

CREATE TABLE buddiesList(
    _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name TEXT NOT NULL
);

CREATE TABLE likes (
    _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    buddy_id INTEGER REFERENCES buddiesList(_id) ON DELETE CASCADE NOT NULL,
    likes TEXT NOT NULL
);
_id  name   likes_id  likes
1   |Ted   |5        |Facebook
1   |Ted   |4        |Murder
2   |Ed    |1        |Beer
2   |Ed    |2        |Cats 
2   |Ed    |3        |Stock-car racing
3   |Red   |6        |Bananarama
现在,在您的设置中,您可以创建buddiesList和likes之间连接的视图,当选择时,它将像一个普通的表一样-当然,您不能在不使用触发器的情况下从中更新/删除或插入

CREATE VIEW buddyLikes AS 
    SELECT buddiesList.*, likes._id AS likes_id, likes.likes as likes 
    FROM buddiesList LEFT JOIN likes ON buddiesList._id=likes.buddy_id;
视图是使用execSQL创建的,就像表或触发器一样

通过视图,您可以从好友和喜欢的人之间的连接中进行选择,返回所有好友及其喜欢的人,如下所示:

SELECT * from buddyLikes;
这将返回如下内容:

CREATE TABLE buddiesList(
    _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name TEXT NOT NULL
);

CREATE TABLE likes (
    _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    buddy_id INTEGER REFERENCES buddiesList(_id) ON DELETE CASCADE NOT NULL,
    likes TEXT NOT NULL
);
_id  name   likes_id  likes
1   |Ted   |5        |Facebook
1   |Ted   |4        |Murder
2   |Ed    |1        |Beer
2   |Ed    |2        |Cats 
2   |Ed    |3        |Stock-car racing
3   |Red   |6        |Bananarama
顺便说一句:如果你想在你的数据库中支持外键,你需要调用execSQL 与:


在SQLiteOpenHelperOpenSQLiteDatabase数据库中

编写一个查询并使用SQLiteDatabase.rawQuerysql,params运行。

您的buddiesList和likes表实际上没有任何适合加入的内容-如果您打算将name_id作为likes中的外键,则它不应该是自动递增的主键。Ohhh ok。如何通过编码为外键设置name_id。喜欢例如,我在buddiesList中为整型主键自动递增设置了name_id,为text not null设置了name。您通常不会通过编码来实现这一点-最佳做法是使用SQL将其定义为外键-并在buddiesList中的行被删除时,使用诸如级联之类的内置功能来清理likes表。您是说我需要在SQL软件中定义为外键?我使用的是SQLiteDatabase Browser v2.0,但它是用3.6.18版构建的。您所说的像级联这样的内置功能是什么意思?我使用的是EclipseIDEVersion3.7Indigothat工具使用的是一个非常旧的SQLite版本,而外键的语法出现在3.6.18中,直到3.6.19才添加支持。你可能应该考虑自己设计表格——对于像你例子中的小表格来说,这可能更好。你的目标是什么版本的Android?