我正在开发一个 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
如有任何帮助,我们将不胜感激。
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