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

时间:2016-08-23 15:12:30

标签: java android realm

我决定将Realm用于我的Android应用之一。这就是为什么我只是想用Realm为R& D目的制作一个简单的应用程序。但我很困惑,如果这是使用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();
    }
}

现在我正在创建此类的实例并使用这些方法执行操作。

这是我的Realm对象类PersonDetailsModel.java

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";
    }
}

这是MainActivity.java,我将实例化RealmDB类并执行操作:

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);
    }
}

这是我的AddPersonActivity.java课程 -

package com.github.abdalimran.realmandroid;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import java.text.SimpleDateFormat;
import java.util.Date;

public class AddPersonActivity extends AppCompatActivity {

    private EditText name;
    private EditText age;
    private EditText email;
    private EditText address;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_person);

        name= (EditText) findViewById(R.id.name);
        age= (EditText) findViewById(R.id.age);
        email= (EditText) findViewById(R.id.email);
        address= (EditText) findViewById(R.id.address);
    }

    public void AddPerson(View view) {

        Date dNow = new Date();
        SimpleDateFormat ft = new SimpleDateFormat("yyMMddhhmmssMs");
        String uniqueid = ft.format(dNow);

        Log.i("uniqueid",uniqueid);

        String sname=name.getText().toString();
        String sage=age.getText().toString();
        String semail=email.getText().toString();
        String saddress=address.getText().toString();

        PersonDetailsModel person=new PersonDetailsModel();
        person.setId(uniqueid);
        person.setName(sname);
        person.setAge(Integer.parseInt(sage));
        person.setEmail(semail);
        person.setAddress(saddress);

        RealmDB rdb=new RealmDB(getApplicationContext());
        rdb.addData(person);
        rdb.closeRealm();
    }
}

这是将Realm实现到Android项目的正确方法吗?

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

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()

1 个答案:

答案 0 :(得分:2)

public class RealmDB extends Application {
    public RealmDB(Context context) {

基于这两行,我可以非常清楚地告诉你它不是。

有了这个,

0.a)你不应该做#34;应用&#34;手工实例,&#34;应用程序&#34;由Android

创建

0.b)您的public RealmResults getAllData() {应为public RealmResults<PersonDetailsModel> getAllData() {

1。)你没有使用RealmBaseAdapter,你应该这样做,因为目前你不能使用RealmBaseAdapterRealmChangeListener来处理领域的更新

2。)你没有在UI线程上使用executeTransactionAsync(),你应该(事实上,你应该使用executeTransaction()进行同步事务,你不应该在UI线程)

3。)您在MainActivity中创建的Realm实例永远不会关闭

4。)你应该为你的RealmResults保留一个字段变量,以防止它被GC&#39; d(虽然ArrayAdapter也可以锁定它,所以你不会跑来自而不是将字段变量保留到结果中的问题