【问题标题】:How to view the queried data in listview in realm database?如何在realm数据库的listview中查看查询到的数据?
【发布时间】:2017-03-08 22:43:41
【问题描述】:

我是领域数据库的新手,我面临领域数据库从数据库中查询数据的问题。从数据库中查询到的数据如下图

我需要在listview中一一查看查询到的数据。

将数据添加到领域数据库的代码。

  public class MainActivity extends AppCompatActivity {

    private Realm mRealm;
    EditText editText;
    Button btn,btnNext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.editText);
        btn = (Button)findViewById(R.id.button);
        btnNext = (Button)findViewById(R.id.button2);
        Realm.init(getApplicationContext());
        mRealm = Realm.getDefaultInstance();
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String newNames = editText.getText().toString();
                mRealm.beginTransaction();
                MyNames names = mRealm.createObject(MyNames.class);
                names.setName(newNames);
                mRealm.commitTransaction();
                editText.setText("");
            }
        });
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent  = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
            }
        });



    }

}

从数据库中查询数据的代码。

 public class Main2Activity extends AppCompatActivity {

    ListView listview;
    private Realm mRealm;
    Button next;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        listview = (ListView)findViewById(R.id.list);
        next = (Button)findViewById(R.id.button2);

        listdata();
        listAdapter();
    }

    public List<RealmResults<MyNames>> listdata()
    {
        List<RealmResults<MyNames>> names = new ArrayList<>();
        mRealm = Realm.getDefaultInstance();
        RealmQuery<MyNames> data = mRealm.where(MyNames.class);
        RealmResults<MyNames> newData = data.findAll();
        names.add(newData);
        return  names;
    }

    public void listAdapter()
    {
        List<RealmResults<MyNames>> newData = this.listdata();
        ArrayAdapter adapter = new ArrayAdapter(this,R.layout.list_simple,R.id.textname,newData);
        listview.setAdapter(adapter);
    }

公共类 MyNames 扩展 RealmObject {

        String name;
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

请帮助如何在listview中一一查看从数据库中查询到的数据。

【问题讨论】:

  • List&lt;RealmResults&lt;MyNames&gt;&gt; names = new ArrayList&lt;&gt;(); 但为什么呢?

标签: android listview realm


【解决方案1】:

使用RealmBaseAdapter

从数据库中查询数据的代码。

 public class Main2Activity extends AppCompatActivity {
    @BindView(R.id.list)
    ListView listview;

    Realm realm;

    @OnClick(R.id.button2) 
    public void clickButton2() {
        // do next
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        ButterKnife.bind(this);
        realm = Realm.getDefaultInstance();
        RealmResults<MyNames> results = realm.where(MyNames.class).findAllAsync();
        MyNamesAdapter myNamesAdapter = new MyNamesAdapter(results);
        listView.setAdapter(myNamesAdapter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        realm.close();
    }
}

public class MyNamesAdapter extends RealmBaseAdapter<MyNames> {
    private static class ViewHolder {
        TextView text;
    }

    public MyListAdapter(OrderedRealmCollection<Counter> realmResults) {
        super(realmResults);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext())
                    .inflate(android.R.layout.simple_list_item_1, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.text = (TextView) convertView.findViewById(android.R.id.text1);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (adapterData != null) {
            MyNames item = adapterData.get(position);
            viewHolder.text.setText(item.getName());
        }
        return convertView;
    }
}

所以你应该使用RealmResults&lt;T&gt; 和来自https://github.com/realm/realm-android-adaptersRealmBaseAdapter

【讨论】:

  • 我有一个疑问,我可以使用自定义适配器而不是使用 RealmBaseAdapter
  • 仅当您使用 RealmChangeListener 时添加到 RealmResults 调用 adapter.notifyDataSetChanged()
  • @PrabhaKaran 下次请参考文档示例,展示如何将 Realm 与 ListView 一起使用 realm.io/docs/java/latest/#examples
  • 现在数据在列表视图中一一查看,但数据类似于 MyNames = [{names:hi}],MyNames = [{names:Kumar}]..在这我该如何删除括号ans只查看值
  • 你需要使用viewHolder.text.setText(item.getName());而不是item.toString(),并且你不应该使用使用toString()的ArrayAdapter
【解决方案2】:

newDataList&lt;RealmResults&lt;MyNames&gt;&gt;。列表视图显示来自 List&lt;&gt; 的项目,它们是 RealmResult&lt;MyNames&gt;,这是它自己的“集合”,导致列表仅显示包含所有对象的 1 个项目。

但是,您希望在列表视图中显示单个 MyNames 项目,而不是 RealmResults。

您可能正在寻找类似的东西(有点简化)

public List<MyNames> listdata()
{
    mRealm = Realm.getDefaultInstance();
    return mRealm.where(MyNames.class).findAll();
}

public void listAdapter()
{
    List<MyNames> names = listdata();
    ArrayAdapter adapter = new ArrayAdapter(this,R.layout.list_simple,R.id.textname,newData);
    listview.setAdapter(adapter);
}

另外,别忘了关闭Activity#onDestroy()中的领域

【讨论】:

  • 现在数据在列表视图中一一查看,但数据类似于 MyNames = [{names:hi}],MyNames = [{names:Kumar}]..在这我该如何删除括号ans只查看值
  • 如果您想使用 ArrayAdapter,您必须从每个 MyName 对象中收集字符串并将该集合传递给适配器构造函数。否则,您最好使用其他解决方案。它更适合自定义数据显示
  • 感谢您的回答@Tim Castelijns
  • 当然。虽然它没有解释为什么您当前的代码不起作用,但其他答案中的解决方案更好。你可能想接受那个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2015-12-28
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多