我通过这个周期从 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;
}
我的方法对于元数据(表备份)运行良好,但对于 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;
}
关于java - 在我的循环中哪里创建 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22607440/