2016-08-23 100 views
1

我决定将Realm用于我的Android应用程序之一。这就是为什么我只是试图用Realm制作一个简单的应用程序来达到R目的。但是我很困惑,如果这是使用Realm的正确方法。我的项目正在运行并正确显示数据。这里是我的codes-这是在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(); 
    } 
} 

现在我创建这个类的一个实例,并进行使用方法的操作。

这里是我的领域对象类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"; 
    } 
} 

这是我实例化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); 
    } 
} 

这是我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(); 
    } 
} 

是t他是否将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()

+0

你只是在寻找一个是/否?问题是什么?它工作吗?还是你想让别人审查它,并可能重构代码? –

+0

就我个人而言,我认为你应该将'rdb.getAllData()'存储到一个变量中,这样你就不会持续查询数据库,但是没有看到你有什么错误 –

+0

是的..这个工作正常。但我不确定我是否以正确的方式实施它。我希望有人审查我的方法,并建议如果我做错了什么。 –

回答

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

根据这两行,我可以很清楚地告诉你,它不是。

有了这样的,

0.A),你不应该让 “应用程序” 情况下的手, “应用程序” 是由Android创建

0.b)你public RealmResults getAllData() {public RealmResults<PersonDetailsModel> getAllData() {

1)你不使用RealmBaseAdapter,你应该的,因为目前不处理或者与RealmBaseAdapter也不在王国的更新RealmChangeListener

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

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

4.)您应该保留一个字段变量到您的RealmResults以防止它被GC'd(尽管ArrayAdapter也可能锁住它,所以你不会遇到问题来自而不是保留一个字段变量的结果)

+0

WoW..great ..感谢您的宝贵意见。我在这篇文章中增加了一点困惑。请检查一下吗? –

+0

我有一个参数PersonDetailsModel p。但我使用myRealm.createObject(PersonDetailsModel.class)创建领域对象;然后从p获取数据并将其设置为人员。没有办法直接将参数p设置为createObject()? –

+0

不,但如果使用此方法,则应指定'createObject(PersonDetailsModel.class,primaryKey)'。我倾向于使用'insertOrUpdate()',尽管对所有插入的领域对象使用1个分离副本 – EpicPandaForce

相关问题