Android SQLite只显示一行

时间:2017-03-20 06:59:21

标签: android android-sqlite

这是我的代码,用于在片段列表视图中显示产品。 这是我的列表视图片段,它只显示一个项目我无法弄清楚错误请帮我修复它

db = new SQLiteHandler(getActivity());
    HashMap<String, String> recent = db.getRecentDetails();

    hidePDialog();

    Product product = new Product();
    product.setID(recent.get("pid"));
    product.setTitle(recent.get("pname"));
    product.setThumbnailUrl(recent.get("pimage"));
    product.setDes1(recent.get("pdesc1"));
    product.setDes2(recent.get("pdesc2"));


    // adding product to movies array
    productList.add(product);

这是我的数据库助手部分

 public HashMap<String, String> getRecentDetails() {
    HashMap<String, String> recent = new HashMap<String, String>();
    String selectQuery = "SELECT  * FROM " + TABLE_RECENT;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    // Move to first row
    cursor.moveToFirst();
    if (cursor.getCount() > 0) {
        recent.put("pname", cursor.getString(1));
        recent.put("pimage", cursor.getString(2));
        recent.put("pdesc1", cursor.getString(3));
        recent.put("pdesc2", cursor.getString(4));
        recent.put("pid", cursor.getString(5));
    }
    cursor.close();
    db.close();
    // return user
    Log.d(TAG, "Fetching address from Sqlite: " + recent.toString());

    return recent;
}

2 个答案:

答案 0 :(得分:1)

你需要移动光标,在你的代码中你只需要一行。这样做:

for(int i=0;i<cursor.getCount();i++){
    recent.put("pname", cursor.getString(1));
    recent.put("pimage", cursor.getString(2));
    recent.put("pdesc1", cursor.getString(3));
    recent.put("pdesc2", cursor.getString(4));
    recent.put("pid", cursor.getString(5));
    cursor.moveToNext();    
}

而你只是创建了一个product。我不知道你在尝试什么,但你的代码看起来不像是在生成多个条目。使用HashMap,您还需要输入唯一键。即使数据库中有多个条目,HashMap也只填充一次,下一行将覆盖现有条目。 如果您确实需要HashMap,请使用不同的密钥或使用ArrayList作为HashMap类型。例如:

<ArrayList<HashMap<String,String>>

或者在填充HashMap的循环内部,您可以操作密钥:

recent.put("pname"+i, cursor.getString(1));

请参阅HashMap.put()的API:

https://developer.android.com/reference/java/util/HashMap.html#put%28K,%20V%29

修改

你可以这样做:

 public ArrayList<HashMap<String, String>> getRecentDetails() {
    ArrayList<HashMap<String,String>> hashHolder = new ArrayList<HashMap<String,String>>();

    String selectQuery = "SELECT  * FROM " + TABLE_RECENT;

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    // Move to first row
    cursor.moveToFirst();
    for(int i=0;i<cursor.getCount();i++) {
        HashMap<String, String> recent = new HashMap<String, String>();
        recent.put("pname", cursor.getString(1));
        recent.put("pimage", cursor.getString(2));
        recent.put("pdesc1", cursor.getString(3));
        recent.put("pdesc2", cursor.getString(4));
        recent.put("pid", cursor.getString(5));
        hashHolder.add(recent);
    Log.d(TAG, "Fetching address from Sqlite: " + recent.toString());
        cursor.moveToNext();
    }
    cursor.close();
    db.close();
    // return user


    return hashHolder;
}

获取数据:

db = new SQLiteHandler(getActivity());
    ArrayList<HashMap<String, String>> hashHolder= db.getRecentDetails();

    hidePDialog();
for(int i=0;i<hashHolder.size();i++){
    HashMap<String,String> recent = hashHolder.get(i);
    Product product = new Product();
    product.setID(recent.get("pid"));
    product.setTitle(recent.get("pname"));
    product.setThumbnailUrl(recent.get("pimage"));
    product.setDes1(recent.get("pdesc1"));
    product.setDes2(recent.get("pdesc2"));


    // adding product to movies array
    productList.add(product);
}

对不起,我不能保证我的例子中没有任何错误,从头开始制作,目前无法测试。

答案 1 :(得分:0)

您似乎只获取了一行。 您将转到第一个并仅从该行获取数据。

您需要使用moveToNext()遍历其他行,直到读取所有行。

https://developer.android.com/reference/android/database/Cursor.html