java - 在我的循环中哪里创建 ArrayList?

标签 java android database arraylist

我通过这个周期从 Android 手机上的本地数据库检索数据,并且我很确定问题出在 listBackupContacts 内。数组。

这是我的数据库结构:

enter image description here

我的目标是从数据库中获取所有 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();
        }

这是我在数据库中的数据:

enter image description here

我知道我的问题是我只是在做 .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/

相关文章:

java - 如何使用 Java 最大化带有氦气的浏览器窗口?

javascript - 是否可以通过一些在线工具将java转换为java脚本?

database - Scylla 如何从其缓存中逐出数据?

c# - 数据集中关系的目的是什么?

java - 在 Java 中使用 final 关键字会提高性能吗?

java - 如何在存在另一个提供程序的情况下使用 java 内部 XMLStreamWriter

android - 无法从 TestFairy 下载之前上传的 .apk 文件

android - java.lang.IllegalArgumentException : 'retrofit2.Response' is not a valid response body type. 你是说 ResponseBody 吗?对于方法 Api.NewLocation

java - 在启动时启动应用程序会使应用程序崩溃

sql - 如何获取 SQL 格式的输出