Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库只返回最后一个数据库项_Java_Android_Database - Fatal编程技术网

Java 数据库只返回最后一个数据库项

Java 数据库只返回最后一个数据库项,java,android,database,Java,Android,Database,这是我第一次尝试在android中使用数据库。我希望我的应用程序获取所有数据库数据并将它们显示在列表中。我的问题是,我只是显示列表中数据库的最后一项。这是我获取数据库数据的代码: public String[] getData() { String[] columns =new String[]{DBHelper.ROWID, DBHelper.TITLE , DBHelper.AUTHOR, DBHelper.ISBN }; Cursor c=ourDatabase.que

这是我第一次尝试在android中使用数据库。我希望我的应用程序获取所有数据库数据并将它们显示在列表中。我的问题是,我只是显示列表中数据库的最后一项。这是我获取数据库数据的代码:

public String[] getData()
{

    String[] columns =new String[]{DBHelper.ROWID, DBHelper.TITLE ,  DBHelper.AUTHOR, DBHelper.ISBN };
    Cursor c=ourDatabase.query(DBHelper.DATABASE_TABLE, columns, null, null, null, null, null);
    String sa = null;
    String sb = null;
    String sc = null;


    int iRow=c.getColumnIndex(DBHelper.ROWID);
    int is1=c.getColumnIndex(DBHelper.TITLE);
        int is2=c.getColumnIndex(DBHelper.AUTHOR);
            int is3=c.getColumnIndex(DBHelper.ISBN);

            for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
                 sa=c.getString(is1);
                 sb=c.getString(is2);
                 sc=c.getString(is3);
            }
return new String[] {sa,sb,sc};
}
为了查看整个数据库,我必须返回什么?谢谢

这是我的onCreate:

  HotOrNot entry2=new HotOrNot(this);
       entry2.open();  
          String[] data2=entry2.getData();
          entry2.close();

          Toast.makeText(SQLView.this,data2[0].toString()+"  "+data2[1].toString()+"  "+data2[2].toString(), Toast.LENGTH_SHORT).show();




       ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();


       HashMap<String, String> map = new HashMap<String, String>();

       for(int i=0;i<data2.length;i+=3){
       map = new HashMap<String, String>();
       map.put("name",data2[i].toString());
       map.put("address", data2[i+1].toString());
       map.put("address2", data2[i+2].toString());

       mylist.add(map);
       }


       // ...
       ListAdapter mSchedule = new SimpleAdapter(this, mylist, R.layout.row,
               new String[] { "name", "address", "address2"},
               new int[] {R.id.rtextView1,R.id.rtextView2,R.id.rtextView3});
       lv.setAdapter(mSchedule);


getData
方法中,您正在循环,在循环的每次迭代中,您都会设置sa、sb和sc。但是,在循环退出之前,您不会将它们添加到任何集合中,因此数组只保存最后一组值。如果仍要返回字符串数组,可以执行以下操作:

List<Map<String,String>> data = new ArrayList<Map<String,String>>();
 int iRow=c.getColumnIndex(DBHelper.ROWID);
    int is1=c.getColumnIndex(DBHelper.TITLE);
        int is2=c.getColumnIndex(DBHelper.AUTHOR);
            int is3=c.getColumnIndex(DBHelper.ISBN);

            for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
                 sa=c.getString(is1);
                 sb=c.getString(is2);
                 sc=c.getString(is3);
                 Map<String,String> map = new HashMap<String,String>();
                 map.put("name",sa);
                 map.put("address",sb);
                 map.put("address2",sc);
                 data.add(map);
            }

return data;
List data=new ArrayList();
int iRow=c.getColumnIndex(DBHelper.ROWID);
int is1=c.getColumnIndex(DBHelper.TITLE);
int is2=c.getColumnIndex(DBHelper.AUTHOR);
int is3=c.getColumnIndex(DBHelper.ISBN);
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
sa=c.getString(is1);
sb=c.getString(is2);
sc=c.getString(is3);
Map Map=newhashmap();
地图放置(“名称”,sa);
地图放置(“地址”,sb);
地图放置(“地址2”,sc);
数据。添加(地图);
}
返回数据;
然后,在onCreate方法中,您可以简单地执行以下操作:

  HotOrNot entry2=new HotOrNot(this);
  entry2.open();  
  List<Map<String,String>> data2=entry2.getData();
  entry2.close();
  ListAdapter mSchedule = new SimpleAdapter(this, data2, R.layout.row,
               new String[] { "name", "address", "address2"},
               new int[] {R.id.rtextView1,R.id.rtextView2,R.id.rtextView3});
  lv.setAdapter(mSchedule);
HotOrNot entry2=新的HotOrNot(此);
entry2.open();
List data2=entry2.getData();
entry2.close();
ListAdapter msSchedule=new SimpleAdapter(此,数据2,R.layout.row,
新字符串[]{“名称”、“地址”、“地址2”},
新的int[]{R.id.rtextView1,R.id.rtextView2,R.id.rtextView3});
lv.setAdapter(mSchedule);

getData
方法中,您正在循环,在循环的每次迭代中,您都会设置sa、sb和sc。但是,在循环退出之前,您不会将它们添加到任何集合中,因此数组只保存最后一组值。如果仍要返回字符串数组,可以执行以下操作:

List<Map<String,String>> data = new ArrayList<Map<String,String>>();
 int iRow=c.getColumnIndex(DBHelper.ROWID);
    int is1=c.getColumnIndex(DBHelper.TITLE);
        int is2=c.getColumnIndex(DBHelper.AUTHOR);
            int is3=c.getColumnIndex(DBHelper.ISBN);

            for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
                 sa=c.getString(is1);
                 sb=c.getString(is2);
                 sc=c.getString(is3);
                 Map<String,String> map = new HashMap<String,String>();
                 map.put("name",sa);
                 map.put("address",sb);
                 map.put("address2",sc);
                 data.add(map);
            }

return data;
List data=new ArrayList();
int iRow=c.getColumnIndex(DBHelper.ROWID);
int is1=c.getColumnIndex(DBHelper.TITLE);
int is2=c.getColumnIndex(DBHelper.AUTHOR);
int is3=c.getColumnIndex(DBHelper.ISBN);
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
sa=c.getString(is1);
sb=c.getString(is2);
sc=c.getString(is3);
Map Map=newhashmap();
地图放置(“名称”,sa);
地图放置(“地址”,sb);
地图放置(“地址2”,sc);
数据。添加(地图);
}
返回数据;
然后,在onCreate方法中,您可以简单地执行以下操作:

  HotOrNot entry2=new HotOrNot(this);
  entry2.open();  
  List<Map<String,String>> data2=entry2.getData();
  entry2.close();
  ListAdapter mSchedule = new SimpleAdapter(this, data2, R.layout.row,
               new String[] { "name", "address", "address2"},
               new int[] {R.id.rtextView1,R.id.rtextView2,R.id.rtextView3});
  lv.setAdapter(mSchedule);
HotOrNot entry2=新的HotOrNot(此);
entry2.open();
List data2=entry2.getData();
entry2.close();
ListAdapter msSchedule=new SimpleAdapter(此,数据2,R.layout.row,
新字符串[]{“名称”、“地址”、“地址2”},
新的int[]{R.id.rtextView1,R.id.rtextView2,R.id.rtextView3});
lv.setAdapter(mSchedule);

您的方法返回一个包含3个值的数组:sa、sb和sc(您应该使用更多描述性名称)。 您应该让它返回数组列表。列表中的每个数组都是表中的一行:

public List<String[]> getData() {
    // ...
    List<String[]> result = new ArrayList<String[]>()
    for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        String sa = c.getString(is1);
        String sb = c.getString(is2);
        String sc = c.getString(is3);
        result.add(new String[] {sa, sb, sc});
    }
    return result;
}
public List getData(){
// ...
列表结果=新建ArrayList()
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String sa=c.getString(is1);
String sb=c.getString(is2);
String sc=c.getString(is3);
add(新字符串[]{sa,sb,sc});
}
返回结果;
}
由于Java是一种OO语言,您甚至应该为每一行创建一个对象:

public List<SomeObject> getData() {
    // ...
    List<String[]> result = new ArrayList<String[]>()
    for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        String sa = c.getString(is1);
        String sb = c.getString(is2);
        String sc = c.getString(is3);
        result.add(new SomeObject(sa, sb, sc));
    }
    return result;
}
public List getData(){
// ...
列表结果=新建ArrayList()
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String sa=c.getString(is1);
String sb=c.getString(is2);
String sc=c.getString(is3);
结果.添加(新的SomeObject(sa、sb、sc));
}
返回结果;
}

您的方法返回一个包含3个值的数组:sa、sb和sc(您应该使用更多描述性名称)。 您应该让它返回数组列表。列表中的每个数组都是表中的一行:

public List<String[]> getData() {
    // ...
    List<String[]> result = new ArrayList<String[]>()
    for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        String sa = c.getString(is1);
        String sb = c.getString(is2);
        String sc = c.getString(is3);
        result.add(new String[] {sa, sb, sc});
    }
    return result;
}
public List getData(){
// ...
列表结果=新建ArrayList()
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String sa=c.getString(is1);
String sb=c.getString(is2);
String sc=c.getString(is3);
add(新字符串[]{sa,sb,sc});
}
返回结果;
}
由于Java是一种OO语言,您甚至应该为每一行创建一个对象:

public List<SomeObject> getData() {
    // ...
    List<String[]> result = new ArrayList<String[]>()
    for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        String sa = c.getString(is1);
        String sb = c.getString(is2);
        String sc = c.getString(is3);
        result.add(new SomeObject(sa, sb, sc));
    }
    return result;
}
public List getData(){
// ...
列表结果=新建ArrayList()
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
String sa=c.getString(is1);
String sb=c.getString(is2);
String sc=c.getString(is3);
结果.添加(新的SomeObject(sa、sb、sc));
}
返回结果;
}

这是因为您正在覆盖字符串数组中的值,并且无法在包含3个元素的字符串数组中返回整个数据库

更好的方法是返回游标并在需要时从游标检索数据。或者,您可以使用字符串数组的ArrayList来存储和返回方法中的值。请看JB Nizet的代码答案

编辑:查看onCreate,我建议直接使用游标创建游标适配器,并将其设置为ListAdapter。您不必经历地图的创建过程。这会让你的生活简单得多


下面是一个用于创建
SimpleCursorAdapter
s

的示例,这是因为您正在覆盖字符串数组中的值,并且无法在包含3个元素的字符串数组中返回整个数据库

更好的方法是返回游标并从中检索数据