Java 这是在Android中使用Realm的正确方法吗?

Java 这是在Android中使用Realm的正确方法吗?,java,android,realm,Java,Android,Realm,我已经决定将Realm应用于我的一个Android应用程序。这就是为什么我只是想用Realm做一个简单的应用程序用于研发目的。但我不知道这是否是使用领域的正确方式。我的项目正在正常工作并正确显示数据。这是我的密码- 我创建了一个java类RealmDB.java: package com.github.abdalimran.realmandroid; import android.app.Application; import android.content.Context; import

我已经决定将Realm应用于我的一个Android应用程序。这就是为什么我只是想用Realm做一个简单的应用程序用于研发目的。但我不知道这是否是使用领域的正确方式。我的项目正在正常工作并正确显示数据。这是我的密码-

我创建了一个java类
RealmDB.java

package com.github.abdalimran.realmandroid;

import android.app.Application;
import android.content.Context;

import io.realm.Realm;
import io.realm.RealmConfiguration;
import io.realm.RealmResults;

public class RealmDB extends Application{

    private Realm myRealm;

    public RealmDB(Context context) {
        myRealm = Realm.getInstance(new RealmConfiguration.Builder(context)
                .name("myOtherRealm.realm")
                .build());
    }

    public void addData(PersonDetailsModel p) {
        myRealm.beginTransaction();
        PersonDetailsModel person = myRealm.createObject(PersonDetailsModel.class);
        person.setName(p.getName());
        person.setAge(p.getAge());
        person.setEmail(p.getEmail());
        person.setAddress(p.getAddress());
        myRealm.commitTransaction();
    }

    public RealmResults getAllData() {
        RealmResults<PersonDetailsModel> query = myRealm.where(PersonDetailsModel.class).findAll();
        return query;
    }

    public void closeRealm() {
        myRealm.close();
    }
}
package com.github.abdalimran.realmandroid;

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;

public class PersonDetailsModel extends RealmObject
{
    @PrimaryKey
    private String id;
    private String name;
    private String email;
    private String address;
    private int age;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return  "ID: "+getId()+"\n"+
                "Name: "+getName()+"\n"+
                "Age: "+getAge()+"\n"+
                "Email: "+getEmail()+"\n"+
                "Address: "+getAddress()+"\n";
    }
}
这是我实例化RealmDB类并执行操作的
MainActivity.java

package com.github.abdalimran.realmandroid;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private ListView lvPersonNameList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lvPersonNameList= (ListView) findViewById(R.id.lvPersonNameList);

        RealmDB rdb=new RealmDB(this);

        Log.i("list",""+rdb.getAllData());

        if(rdb.getAllData()==null){
            Toast.makeText(MainActivity.this, "No data found. Add person.", Toast.LENGTH_SHORT).show();
        }
        else {
            ArrayAdapter<PersonDetailsModel> adapter = new ArrayAdapter<>(this,
                    android.R.layout.simple_list_item_1,
                    android.R.id.text1,
                    rdb.getAllData());
            lvPersonNameList.setAdapter(adapter);
        }
    }


    public void AddPerson(View view) {
        Intent intent=new Intent(this,AddPersonActivity.class);
        startActivity(intent);
    }
}
这是在Android项目中实现Realm的正确方法吗

大多数情况下,我对以下代码感到困惑:

public void addData(PersonDetailsModel p) {
        myRealm.beginTransaction();
        PersonDetailsModel person = myRealm.createObject(PersonDetailsModel.class);
        person.setName(p.getName());
        person.setAge(p.getAge());
        person.setEmail(p.getEmail());
        person.setAddress(p.getAddress());
        myRealm.commitTransaction();
    }
这里有一个参数
PersonDetailsModel p
。但是我正在使用
myRealm.createObject(PersonDetailsModel.class)创建一个领域对象
然后从
p
获取数据,并将其设置为
person
。没有办法直接将参数
p
设置为
createObject()

基于这两条线,我可以很清楚地告诉你,事实并非如此

因此

0.a)您不应该手工制作“应用程序”实例,“应用程序”是由Android创建的

0.b)您的
public RealmResults getAllData(){
应该是
public RealmResults getAllData(){

1.)您没有使用
RealmBaseAdapter
,您应该这样做,因为当前您既不使用
RealmBaseAdapter
也不使用
realmchangelister

2.)您没有在UI线程上使用
executeTransactionAsync()
,您应该这样做(事实上,您应该使用
executeTransaction()
进行同步事务,并且不应该在UI线程上执行同步写入)

3.)在MainActivity中创建的领域实例从未关闭


4.)您应该在
RealmResults
中保留一个字段变量,以防止它被GC'd(尽管
ArrayAdapter
也可能会锁定它,因此您不会遇到不将字段变量保留到结果中的问题)

您是否只是在寻找一个是/否?问题是什么?它是否有效?或者您是否希望有人检查它并可能重构代码?我个人认为您应该存储
rdb.getAllData()
转换为一个变量,这样你就不会连续查询数据库,但你所拥有的看起来没有问题是的..这是可行的。但我不确定我是否以正确的方式实现了它。我希望有人检查我的方法,并建议我是否做错了。如果可行,那么你为什么认为有什么问题?哇..太好了..谢谢你的建议有价值的建议。我在这篇文章中又添加了一个混淆点。请检查一下好吗?我有一个参数PersonDetailsModel p。但是我正在使用myRealm.createObject(PersonDetailsModel.class)创建一个领域对象;然后从p获取数据并将其设置为person。是否有办法直接将参数p设置为createObject()?否,但如果使用此方法,则应指定
createObject(PersonDetailsModel.class,primaryKey)
。我倾向于使用
insertOrUpdate()
尽管对所有插入的领域对象使用1个分离副本,顺便说一下,我的个人资料中有一篇文章链接到一个非常简单的示例项目,演示了领域:p的用法
public void addData(PersonDetailsModel p) {
        myRealm.beginTransaction();
        PersonDetailsModel person = myRealm.createObject(PersonDetailsModel.class);
        person.setName(p.getName());
        person.setAge(p.getAge());
        person.setEmail(p.getEmail());
        person.setAddress(p.getAddress());
        myRealm.commitTransaction();
    }
public class RealmDB extends Application {
    public RealmDB(Context context) {