我有这个周期可以从Android手机上的本地数据库中检索数据,并且我很确定问题出在listBackupContacts
数组之内。
这是我的数据库结构:
我的目标是从数据库中获取所有BackupContacts及其元数据。
public ArrayList<Backup> getAllBackupContacts() throws UnsupportedEncodingException
{
final SQLiteDatabase db = getReadableDatabase();
final String selectQuery = "SELECT * FROM " + BACKUP_TABLE_NAME + ", " + BACKUPCONTACTS_TABLE_NAME + " WHERE " + BACKUP_TABLE_NAME+"."+BACKUP_ID + " = " + BACKUPCONTACTS_TABLE_NAME+"."+BACKUPCONTACTS_ID_BACKUP_FK;
final Cursor cursor = db.rawQuery(selectQuery, null);
ArrayList<Backup> listBackupsToReturn = new ArrayList<Backup>();
ArrayList<BackupContact> listBackupContacts = new ArrayList<BackupContact>(); // Where shall I create this ArrayList inside my cycle?
if(cursor.moveToFirst())
{
Integer aux = 0;
do{
final Integer idBackup = cursor.getInt(0);
final Long timestamp = cursor.getLong(1);
final Integer contactsCount = cursor.getInt(2);
final String description = cursor.getString(3);
final Integer restoreCount = cursor.getInt(4);
final Integer idBackupContact = cursor.getInt(5);
final String vcard = new String(cursor.getBlob(7), "UTF-8");
final String displayName = cursor.getString(8);
if(aux != idBackup)
{
Backup backup = new Backup();
BackupInfo backupInfo = new BackupInfo(idBackup, description, contactsCount, restoreCount, timestamp);
if(!listBackupContacts.isEmpty())
{
backup.setBackupContacts(listBackupContacts);
listBackupsToReturn.add(backup);
listBackupContacts.clear();
aux = idBackup;
}
BackupContact backupContact = new BackupContact(idBackupContact, idBackup, vcard, displayName);
listBackupContacts.add(backupContact);
backup.setBackupInfo(backupInfo);
}
else
{
BackupContact backupContact = new BackupContact(idBackupContact, idBackup, vcard, displayName);
listBackupContacts.add(backupContact);
aux = idBackup;
}
} while(cursor.moveToNext());
}
return listBackupsToReturn;
}
我的方法对于元数据(表Backup)工作正常,但对于BackupContacts,它重复相同的值。
这是输出:
idBackup INFO: 1 || timestamp INFO: 1395407411 || description INFO: feito por mim || contactsCount INFO: 1 || restoreCount INFO: 0
idBackup: 4 || idBackupContacts: 13 || vcard: vcard 0 || displayName: Marco 0
idBackup: 4 || idBackupContacts: 14 || vcard: vcard 1 || displayName: Marco 1
idBackup: 4 || idBackupContacts: 15 || vcard: vcard 2 || displayName: Marco 2
idBackup: 4 || idBackupContacts: 16 || vcard: vcard 3 || displayName: Marco 3
----------------------------------------------------------------------
idBackup INFO: 2 || timestamp INFO: 1395407411 || description INFO: backup segundo || contactsCount INFO: 1 || restoreCount INFO: 0
idBackup: 4 || idBackupContacts: 13 || vcard: vcard 0 || displayName: Marco 0
idBackup: 4 || idBackupContacts: 14 || vcard: vcard 1 || displayName: Marco 1
idBackup: 4 || idBackupContacts: 15 || vcard: vcard 2 || displayName: Marco 2
idBackup: 4 || idBackupContacts: 16 || vcard: vcard 3 || displayName: Marco 3
----------------------------------------------------------------------
idBackup INFO: 3 || timestamp INFO: 1395407411 || description INFO: backup terceiro || contactsCount INFO: 1 || restoreCount INFO: 0
idBackup: 4 || idBackupContacts: 13 || vcard: vcard 0 || displayName: Marco 0
idBackup: 4 || idBackupContacts: 14 || vcard: vcard 1 || displayName: Marco 1
idBackup: 4 || idBackupContacts: 15 || vcard: vcard 2 || displayName: Marco 2
idBackup: 4 || idBackupContacts: 16 || vcard: vcard 3 || displayName: Marco 3
----------------------------------------------------------------------
idBackup INFO: 4 || timestamp INFO: 1395407411 || description INFO: backup quarto || contactsCount INFO: 1 || restoreCount INFO: 0
idBackup: 4 || idBackupContacts: 13 || vcard: vcard 0 || displayName: Marco 0
idBackup: 4 || idBackupContacts: 14 || vcard: vcard 1 || displayName: Marco 1
idBackup: 4 || idBackupContacts: 15 || vcard: vcard 2 || displayName: Marco 2
idBackup: 4 || idBackupContacts: 16 || vcard: vcard 3 || displayName: Marco 3
这是我的输出代码:
try {
ArrayList<Backup> list = dt.getAllBackupContacts();
for(int i = 0; i<list.size(); i++)
{
Log.d(TAG, "----------------------------------------------------------------------");
Backup backup = list.get(i);
BackupInfo backupInfo = backup.getBackupInfo();
ArrayList<BackupContact> backupContacts = backup.getListOfBackupContacts();
Log.d(TAG, "idBackup INFO: " + backupInfo.getIdBackup() + " || timestamp INFO: " + backupInfo.getTimestamp()
+ " || description INFO: " + backupInfo.getDescription() + " || contactsCount INFO: " + backupInfo.getContactsCount()
+ " || restoreCount INFO: " + backupInfo.getRestoreCount());
for(int j = 0; j<backupContacts.size(); j++)
{
BackupContact backupContact = backupContacts.get(j);
Log.d(TAG, "idBackup: " + backupContact.getIdBackup() + " || idBackupContacts: " + backupContact.getIdBackupsContact()
+ " || vcard: " + backupContact.getVcard() + " || displayName: " + backupContact.getDisplayName());
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
这是我在数据库中的数据:
我知道我的问题是我只是在阵列上执行
.clear()
。我需要为“备份”表中的每个条目重新创建它,但是看不到在哪里创建ArrayList。如果在do {} while()
周期内创建它,则将为数据库中的每一行创建一个,而不是我所需要的。有人可以指出我将我的
ArrayList<BackupContact> listBackupContacts = new ArrayList<BackupContact>();
放在哪里吗? 最佳答案
要回答您的问题,请尝试将listBackupContacts.clear()
替换为listBackupContacts = new ArrayList<BackupContact>()
+其他一些模组(请参见下文)
我看不到还有其他方法可以解决将单个listBackupContents对象分配给最终值集(其中idBackup == 4)的问题。
ArrayList<BackupContact> listBackupContacts = null; // don't create yet
if(cursor.moveToFirst())
{
Integer aux = 0;
do{
final Integer idBackup = cursor.getInt(0);
final Long timestamp = cursor.getLong(1);
final Integer contactsCount = cursor.getInt(2);
final String description = cursor.getString(3);
final Integer restoreCount = cursor.getInt(4);
final Integer idBackupContact = cursor.getInt(5);
final String vcard = new String(cursor.getBlob(7), "UTF-8");
final String displayName = cursor.getString(8);
if(aux != idBackup)
{
Backup backup = new Backup();
BackupInfo backupInfo = new BackupInfo(idBackup, description, contactsCount, restoreCount, timestamp);
listBackupContacts = new ArrayList<BackupContact>();
backup.setBackupContacts(listBackupContacts);
listBackupsToReturn.add(backup);
backup.setBackupInfo(backupInfo);
aux = idBackup;
}
BackupContact backupContact = new BackupContact(idBackupContact, idBackup, vcard, displayName);
listBackupContacts.add(backupContact);
} while(cursor.moveToNext());
}
return listBackupsToReturn;
}