簡體   English   中英

Android SQLite如何使用Foreign KEY插入值

[英]Android SQLite how to insert values with Foreign KEY

我在Android使用SQLite創建了一個database ,我有一個table Playlist_Songs ,它在兩個表上使用foreign keysSongsPlaylists

如何從另一個表中添加外鍵值,因為values.put(playlists_songs_playlistid, "(SELECT "+playlists_id+" FROM "+TABLE_PLAYLISTS+" WHERE "+playlists_name+"="+playlist+")"); 在我的情況下不起作用。

public class MusicDB extends SQLiteOpenHelper{

public static String DATABASE_NAME = "MusicDB";
public static final int DATABASE_VERSION = 4;

public static final String TABLE_CONFIG = "config";
public static final String TABLE_SONGS = "songs";
public static final String TABLE_PLAYLISTS = "playlists";
public static final String TABLE_PLAYLISTS_SONGS = "playlists_songs";

// CONFIG TABLE //
public static final String config_id = "id";
public static final String config_Directory = "Directory";

// SONGS TABLE //
public static final String songs_id = "id";
public static final String songs_name = "Name";
public static final String songs_path = "Path";
public static final String songs_downloadLing = "downloadLing";

// PLAYLISTS TABLE //
public static final String playlists_id = "id";
public static final String playlists_name = "Name";

// PLAYLISTS SONGS TABLE //
public static final String playlists_songs_id = "id";
public static final String playlists_songs_playlistid = "playlist_id";
public static final String playlists_songs_songid = "song_id";

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

@Override
public void onCreate(SQLiteDatabase db) {
    final String CREATE_CONFIG_TABLE = "CREATE TABLE "+TABLE_CONFIG+" ("+config_id+" INTEGER PRIMARY KEY,"+config_Directory+" TEXT NOT NULL UNIQUE)";
    db.execSQL(CREATE_CONFIG_TABLE);

    final String CREATE_SONGS_TABLE = "CREATE TABLE "+TABLE_SONGS+" ("+songs_id+" INTEGER PRIMARY KEY,"+songs_name+" TEXT NOT NULL UNIQUE,"+songs_path+" TEXT NOT NULL,"+songs_downloadLing+" TEXT UNIQUE)";
    db.execSQL(CREATE_SONGS_TABLE);

    final String CREATE_PLAYLISTS_TABLE = "CREATE TABLE "+TABLE_PLAYLISTS+" ("+playlists_id+" INTEGER PRIMARY KEY,"+playlists_name+" TEXT NOT NULL UNIQUE)";
    db.execSQL(CREATE_PLAYLISTS_TABLE);

    final String CREATE_PLAYLISTS_SONGS = "CREATE TABLE "+TABLE_PLAYLISTS_SONGS+" ("+playlists_songs_id+" INTEGER PRIMARY KEY,"+playlists_songs_playlistid+" INTEGER NOT NULL,"+
            playlists_songs_songid+" INTEGER NOT NULL, FOREIGN KEY ("+playlists_songs_playlistid+") REFERENCES "+TABLE_PLAYLISTS+"("+playlists_id+") ON DELETE CASCADE," +
            "FOREIGN KEY ("+playlists_songs_songid+") REFERENCES "+TABLE_SONGS+"("+songs_id+") ON DELETE CASCADE);";
    db.execSQL(CREATE_PLAYLISTS_SONGS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.i("TEST", "Se apeleaza onUPDATE");
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONFIG);
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_SONGS);

    onCreate(db);
}

public void addDirectory(String name) {

    Log.i("TEST", "Adaug in Config " + name);

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(config_Directory, name);

    db.insert(TABLE_CONFIG, null, values);
    db.close();
}

public ArrayList<String> getDirectories() {
    ArrayList<String> directories = new ArrayList<>();

    String selectQuery = "SELECT * FROM "+TABLE_CONFIG;

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

    if (cursor.moveToFirst()) {
        do {
            directories.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return directories;
}

public void addSong(String name, String path) {
    Log.i("TEST", "Adaug in Songs " + name);

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(songs_name, name);
    values.put(songs_path, path);

    db.insert(TABLE_SONGS, null, values);
    db.close();
}

public ArrayList<String> getSongsByName() {
    ArrayList<String> songs = new ArrayList<>();

    String selectQuery = "SELECT * FROM "+TABLE_SONGS;

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

    if (cursor.moveToFirst()) {
        do {
            songs.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return songs;
}

public void addPlaylist(String name) {
    Log.i("TEST", "Adaug in Playlists " + name);

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(playlists_name, name);

    db.insert(TABLE_PLAYLISTS, null, values);
    db.close();
}

public ArrayList<String> getPlaylists() {
    ArrayList<String> playlists = new ArrayList<>();

    String selectQuery = "SELECT * FROM "+TABLE_PLAYLISTS;

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

    if (cursor.moveToFirst()) {
        do {
            playlists.add(cursor.getString(1));
        } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    return playlists;
}

public void addSongToPlaylist(String song, String playlist) {
    Log.i("TEST", "Adaug in Playlistul " + playlist +" melodia "+song);

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    values.put(playlists_songs_playlistid, "(SELECT "+playlists_id+" FROM "+TABLE_PLAYLISTS+" WHERE "+playlists_name+"="+playlist+")");
    values.put(playlists_songs_songid, "(SELECT "+songs_id+" FROM "+TABLE_SONGS+" WHERE "+songs_name+"="+song+")");

    db.insert(TABLE_PLAYLISTS_SONGS, null, values);
    db.close();
}

}

ContentValues僅支持普通值,而不支持SQL表達式。

您可以使用query()單獨執行查詢查詢,也可以使用execSQL執行自己的SQL:

db.execSQL("INSERT INTO "+TABLE_PLAYLISTS_SONGS+
           "("+playlists_songs_playlistid+","+
               playlists_songs_songid+")"+
           "VALUES((SELECT "+playlists_id+
                   " FROM "+TABLE_PLAYLISTS+
                   " WHERE "+playlists_name+"=?),"+
                  "(SELECT "+songs_id+
                   " FROM "+TABLE_SONGS+
                   " WHERE "+songs_name+"=?))",
           new Object[]{ playlist, song });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM