我有这个周期可以从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;


}

10-06 12:41
查看更多