0

所以,我会尽量让这个简单。我使用这个调用来用相关数据更新我的列表spisak :

parent.queryDatabase(spisak, params);

方法如下:

public void queryDatabase(List<School> spisak, String[] args) {
    databaseHelper.open();
    Cursor c;
    c = databaseHelper.getAllSchools();
    if(!c.moveToFirst()) {
        Toast.makeText(getApplicationContext(), "Ova pretraga nije vratila nijednu školu", Toast.LENGTH_SHORT).show();
    }
    else {
        spisak = cursorToSchool(c);
    }
    databaseHelper.close();
}
public List<School> cursorToSchool(Cursor c) {
    //Converts the Cursor object to temporary School object
    List<School> listing = new ArrayList<School>();
    School s = new School();
    do {
        s.setId(c.getInt(0));
        s.setName(c.getString(1));
        s.setAddress(c.getString(2));
        s.setEntryExam(String.valueOf(c.getInt(3)));
        s.setNoS(c.getInt(4));
        s.setTelephone(c.getString(5));
        s.setWebsite(c.getString(6));
        listing.add(s);
    }
    while (c.moveToNext());
    return listing;
}

在被调用的方法中,重复的变量spisak包含它应该具有的数据(我在调试期间检查过),但在该范围之外(回到调用该方法的 FragmentActivity 中)真正的spisak是空的,即在被调用方法中所做的更改是不执着。那么当我在 FragmentActivity 中调用spisak变量时,我应该如何引用它,以便它可以保留在该方法中分配给它的值。例如,在帕斯卡:

调用 methodname(x:integer) 不会持久化数据

调用 methodname(var x:integer) 将持久化数据...

提前致谢。干杯!

4

1 回答 1

0

每次实例化一个新对象时,它都会存储在内存位置。

考虑一下,在您queryDatabase()的方法之外,您传递的变量spisak存储在内存位置 1000 中。

queryDatabase()接收到时spisak,它基本上接收到一个指向内存位置 1000 的指针。

您的cursorToSchool()方法总是创建一个新List<School>变量并返回它。因此,每次调用 时cursorToSchool(),您都在创建一个新对象并将其寻址到新的内存位置。

因此,当您调用spisak = cursorToSchool(c);queryDatabase(),您正在创建一个新对象(假设它位于内存位置 2000)并将其存储在变量中spisak。现在spisak指向内存位置 2000。

问题是调用者queryDatabase()有一个指向内存位置 1000 的变量,而您所做的只是更改内存位置 2000。换句话说,您正在更改您想要的所有内容queryDatabase(),但是对于调用它的人,您什么也没做.

解决您的问题的一个可能方法是返回 aList<School>而不是使其无效,然后返回您的spisak变量。

于 2013-08-28T18:22:57.540 回答