使用 SQLite 和 Java 检索具有“连接状态”的所有记录

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序,它利用 SQLite 数据库来存储和管理音乐数据。我在

DatabaseHelper
类中遇到了一个方法问题,该方法旨在检索与特定歌曲相关的所有乐队及其连接状态。因此,应返回
band_name
表中的所有乐队名称 (
bands
),并且当
band_id
包含在
songs_bands
表中时,布尔值
isConnected
应设置为 1,否则
isConnected
将被设置为 1。 0.

该方法接收

int
参数的
songId
值,并预计返回
List
对象。每个
BandInfo
对象应包含乐队的 ID、名称和一个布尔值,指示乐队是否连接到指定的歌曲 (
BandInfo
)。
这是来自

isConnected

的方法:

DatabaseHelper

当我执行这个方法时,问题就出现了。 
public List<BandInfo> getAllBandsWithConnectionStatus(int songId) { List<BandInfo> bandList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); // Query to retrieve all bands with connection status for a specific song String[] columns = {"bands._id", "bands.band_name", "CASE WHEN songs_bands.band_id IS NULL THEN 0 ELSE 1 END AS is_connected"}; String selection = "songs_bands.song_id = ?"; String[] selectionArgs = {String.valueOf(songId)}; Cursor cursor = db.query( "bands LEFT JOIN songs_bands ON bands._id = songs_bands.band_id", columns, selection, selectionArgs, null, null, null ); if (cursor.moveToFirst()) { int idColumnIndex = cursor.getColumnIndex("_id"); int nameColumnIndex = cursor.getColumnIndex("band_name"); int isConnectedColumnIndex = cursor.getColumnIndex("is_connected"); do { int bandId = cursor.getInt(idColumnIndex); String bandName = cursor.getString(nameColumnIndex); int isConnected = cursor.getInt(isConnectedColumnIndex); BandInfo bandInfo = new BandInfo(bandId, bandName, isConnected == 1); bandList.add(bandInfo); } while (cursor.moveToNext()); } cursor.close(); // Print the list of BandInfo objects before returning for (BandInfo bandInfo : bandList) { Log.d("SplashActivityZZ", "(DatabaseHelper) BandInfo in list: " + bandInfo.toString()); } return bandList; }

不返回完整的

BandInfo
对象列表,而是仅包含连接的带区。未连接的频段不包含在列表中。
我尝试修改查询并检查代码中是否存在任何潜在错误,但无法解决问题。我希望了解如何正确检索所有乐队,包括那些未连接到指定歌曲的乐队,并相应地设置其 

bandList

布尔值。

这是此查询中使用的两个表 - 首先是 

isConnected

:

bands

private static final String SQL_CREATE_BANDS_TABLE = "CREATE TABLE " + DatabaseContract.Bands.TABLE_NAME + " (" + DatabaseContract.Bands._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DatabaseContract.Bands.COLUMN_BAND_NAME + " TEXT NOT NULL, " + DatabaseContract.Bands.COLUMN_BAND_DESCRIPTION + " TEXT)";

user_bands

如有任何帮助,我们将不胜感激。

java sql database sqlite android-studio
1个回答
0
投票
private static final String SQL_CREATE_USER_BANDS_TABLE = "CREATE TABLE " + DatabaseContract.UserBands.TABLE_NAME + " (" + DatabaseContract.UserBands._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DatabaseContract.UserBands.COLUMN_USER_ID + " INTEGER, " + DatabaseContract.UserBands.COLUMN_BAND_ID + " INTEGER, " + "FOREIGN KEY (" + DatabaseContract.UserBands.COLUMN_USER_ID + ") REFERENCES " + DatabaseContract.Users.TABLE_NAME + "(" + DatabaseContract.Users._ID + "), " + "FOREIGN KEY (" + DatabaseContract.UserBands.COLUMN_BAND_ID + ") REFERENCES " + DatabaseContract.Bands.TABLE_NAME + "(" + DatabaseContract.Bands._ID + "))";

但删除了

LEFT JOIN
,因为这似乎导致了问题。我现在正在评估
CASE
循环中的联接,以确定两个表之间是否存在连接,如果存在,我将
do while
标志设置为“true”,如果没有设置为“false”。从这里我将其添加到
isConnected
类对象中。
这是调整后的查询,现在返回 

bandList

表中的所有内容,并在

bands
也存在于
isConnected
表中以供调查的
band_id
时设置标志
songs_bands
song_id

© www.soinside.com 2019 - 2024. All rights reserved.