Backendless查询数据库仅返回1条结果,Android端如何遍历获取全部数据
解决方案
先做基础排查:
- 登录Backendless控制台,进入存储数据的
VIdeos表,手动输入查询条件name != 'Bill'执行查询,确认符合条件的总条目数,如果总数本身就是1,代码返回结果属于正常情况,无需修改。 - 如果控制台查询符合条件的条目数大于1,参考以下方法实现全量遍历:
Backendless的find接口默认采用分页返回数据,你当前设置了单页返回10条、偏移量为0,仅会拉取第一页的数据。要拉取所有符合条件的条目,需要循环拉取每一页的数据直到返回结果为空。
修改后的代码示例
package com.mbass.examples; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.backendless.Backendless; import com.backendless.async.callback.AsyncCallback; import com.backendless.exceptions.BackendlessFault; import com.backendless.persistence.DataQueryBuilder; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private TextView status; private Button updateButton; List<VIdeos> allVideos = new ArrayList<>(); // 单页拉取数量,Backendless免费版单页上限为100,可根据需求调整 private static final int PAGE_SIZE = 20; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); Backendless.setUrl(Defaults.SERVER_URL); Backendless.initApp(getApplicationContext(), Defaults.APPLICATION_ID, Defaults.API_KEY); status = findViewById(R.id.status); updateButton = findViewById(R.id.update_button); updateButton.setEnabled(false); String whereClause = "name != 'Bill'"; DataQueryBuilder queryBuilder = DataQueryBuilder.create(); queryBuilder.setWhereClause(whereClause); queryBuilder.setPageSize(PAGE_SIZE).setOffset(0); queryBuilder.setSortBy("name"); // 递归拉取所有页数据 queryAllVideos(queryBuilder); } private void queryAllVideos(DataQueryBuilder queryBuilder) { Backendless.Persistence.of(VIdeos.class).find(queryBuilder, new AsyncCallback<List<VIdeos>>() { @Override public void handleResponse(List<VIdeos> response) { if (response.isEmpty()) { // 所有数据拉取完成,遍历所有结果 for (VIdeos video : allVideos) { Toast.makeText(MainActivity.this, "Name: " + video.getName() + "\n" + "ID: " + video.getCreated(), Toast.LENGTH_SHORT).show(); } return; } // 把当前页数据加入总列表 allVideos.addAll(response); // 更新偏移量,拉取下一页 queryBuilder.setOffset(queryBuilder.getOffset() + PAGE_SIZE); queryAllVideos(queryBuilder); } @Override public void handleFault(BackendlessFault fault) { Toast.makeText(MainActivity.this, fault.getMessage(), Toast.LENGTH_LONG).show(); } }); } }
额外注意事项
- 你定义的类名是
VIdeos(首字母V和I均为大写),需要确认和Backendless控制台里的表名完全一致,Backendless表名大小写敏感,如果表名不匹配也可能出现返回结果异常的问题。 - 如果你的数据量超过1000条,Backendless免费版有查询次数和返回数据量限制,建议结合业务场景添加必要的过滤条件,避免全表拉取占用过多配额。
内容的提问来源于stack exchange,提问作者David A
相关产品推荐
相关产品推荐

