我正忙于一个程序,该程序需要使用数据库中的下拉列表来填充edit texts
,我使用的是哈希图,但是我需要在哈希图中放置约10列,因为有10个字段需要填充。
这是我的代码:
try {
ConnectionHelper conStr = new ConnectionHelper();
connect = conStr.connectionclass();
if (connect == null) {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
} else {
String query = "select * from Customers";
stmt = connect.prepareStatement(query);
rs = stmt.executeQuery();
ArrayList<String> dataF = new ArrayList<>();
hashmap = new HashMap<>();
while (rs.next()) {
String id = rs.getString("CUSTOMER_ID");
String CName = rs.getString("CUSTOMER_FIRST_NAME");
String Surname = rs.getString("CUSTOMER_SURNAME");
String Number = rs.getString ("CUSTOMER_TEL_NUMBER");
String Cell= rs.getString ("CUSTOMER_CELL_NUMBER");
String Buiilding= rs.getString ("CUSTOMER_BUILDING_NUMBER");
String Street= rs.getString ("CUSTOMER_STREET");
String suburb= rs.getString ("CUSTOMER_SUBURB");
String City= rs.getString ("CUSTOMER_CITY");
String postal= rs.getString ("CUSTOMER_ZIP_CODE");
// value of database
dataF.add(id);
hashmap.put(id,CName,Surname,Number,Cell,Buiilding,Street,suburb,City,postal);
}
ArrayAdapter NoCoreAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, dataF);
customerselect.setAdapter(NoCoreAdapter);
}
} catch (SQLException e) {
e.printStackTrace();
}
customerselect.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
String name = customerselect.getSelectedItem().toString();
String CName = hashmap.get(name);
String Surname = peopleByForename.get(name);
String Number = hashMap1.get(name);
String Cell = hashMap2.get(name);
String Building = hashMap2.get(name);
String Street = hashMap3.get(name);
String suburb = hashMap3.get(name);
String City = hashMap4.get(name);
String postal = hashMap4.get(name);
rFname.setText(CName);
rLname.setText(Surname);
rTelnum.setText(Number);
rCellnum.setText(Cell);
rCusbuild.setText(Building);
rCusstr.setText(Street);
rCussub.setText(suburb);
rCuscity.setText(City);
rCuszip.setText(postal);
}
我收到以下错误:
put() in HashMap cannot be applied to:
Expected Actual
Parameters Arguments
Key: String id
value: String CName
Surname(java.lang.string)
Number(java.lang.string)
Cell(java.lang.string)
Building(java.lang.string)
Street(java.lang.string)
suburb(java.lang.string)
City(java.lang.string)
postal(java.lang.string)
我使用hashmap的原因是因为我遵循的示例使用了hashmaps,但我不知道如何使用列表在下拉列表中显示
答案 0 :(得分:0)
如果您查看put
界面的Map
方法的源代码,您会发现您只能找到:
put(K key, V value)
这正是Map
的工作方式。您将键映射到一个值,这样您就可以快速访问它,而无需遍历整个映射。因此,根据您的情况,我建议您将所有信息存储在Customer
之类的复杂对象中,并将其映射到客户的相关ID。
如果您需要有效地查询客户数据(而不使用ID),请考虑使用可以为您完成工作的数据库。
答案 1 :(得分:0)
哈希图只能包含两列。 <键> <值> 您可以创建一个Customer类并将这些值添加到一个Customer对象。然后将该类放入Hashmap中。
Hashmap<String,Customer> map = new HashMap<>();
map.put(id, new Customer(id,surname,number...));
答案 2 :(得分:0)
HashMap
仅采用两个参数:key
和value
https://docs.oracle.com/javase/8/docs/api/index.html?java/util/HashMap.html
key
应该是对象唯一的标识符。就您而言,您正在使用id
。如果那是数据库表上的主键(或任何其他唯一编号),那是完全正确的。
其他字段需要包装到一个对象中(或单独存储在HashMap中,每个字段都有自己的唯一ID;根据您的问题,这并不是您正在做的事情)。
您应该这样做:
final Customer customerObject = new Customer(CName, Surname, Number, Cell, Buiilding, Street, suburb, City, postal);
hashmap.put(id, customerObject);
创建自定义Customer
类及其所有字段仅供读者练习。
答案 3 :(得分:0)
放置方法具有Map<K, V>.put(K key, V value)
签名。因此,您不能仅添加值。首先弄清楚应该使用什么键,然后使用put方法。您可以通过调用Map.get(Object key)
方法来使用键来检索值。
答案 4 :(得分:0)
这只是一个例子,我希望您了解如何将这个例子与您的Scenerio一起使用。
public class Person{
String name,surName,number,....;
public String getName(){
return name;
}
public void setame(String name){
this.name=name;
}
//Create more getters setters like this
}
// create our map
Map<String, List<Person>> peopleByForename = new HashMap<>();
// populate it
List<Person> people = new ArrayList<>();
people.add(new Person("Bob Smith"));
people.add(new Person("Bob Jones"));
peopleByForename.put("Bob", people);
// read from it
List<Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs[0];
Person bob2 = bobs[1];
答案 5 :(得分:0)
我将创建包含所有字段的客户对象,而不是像hashmap.put(id, yourCustomerObject);
那样添加该对象以进行映射