2016-08-23 9 views
1

自分のAndroidアプリにRealmを使用することに決めました。だからこそ私はRealm for R & Dを使って簡単なアプリケーションを作成しようとしています。しかし、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(); 
    } 
} 

今、私はこのクラスのインスタンスを作成し、メソッドを使用して操作を実行しています。ここで

は私のレルムObjectクラス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(); 
    } 
} 

ですRealmをAndroidプロジェクトに実装するための彼の正しいアプローチは?私は、パラメータPersonDetailsModel 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(); 
    } 

は、主に私は次のコードで混乱しています。しかし、myRealm.createObject(PersonDetailsModel.class);を使用して領域オブジェクトを作成してから、pからデータを取得し、personに設定しています。パラメータpcreateObject()に直接設定する方法はありませんか?

+0

あなたはyes/noを探していますか? ?何が問題ですか?それは動作しますか?あるいは、誰かにレビューし、潜在的にコードをリファクタリングしてもらいたいのですか? –

+0

個人的には、 'rdb.getAllData()'を変数に格納して、データベースに継続的にクエリを出さないようにしておくべきだと思いますが、何も間違っています。 –

+0

はい。しかし、私はそれを正しい方法で実装しているかどうかはわかりません。私は誰かが私のアプローチを見直して、私が何か間違っていることを示唆してほしい。 –

答えて

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

これらの2つの行に基づいて、私はあなたにそれがないことを明確に伝えることができます。

そして、それとともに、

0.a)あなたが手で "アプリケーション" のインスタンスを作るべきではない、 "アプリケーション" はアンドロイド

0.bによって作成された)あなたのpublic RealmResults getAllData() {public RealmResults<PersonDetailsModel> getAllData() {

する必要があります現在、あなたはどちらか RealmBaseAdapterでもしてレルムで更新を処理していないので、

1)あなたは、必要があるRealmBaseAdapterを使用していませんRealmChangeListener

2.)UIスレッドでexecuteTransactionAsync()を使用していないので、実際には同期トランザクションにexecuteTransaction()を使用し、UIスレッドで同期書き込みを実行しないでください)

3.)あなたのレルムMainActivityで作成されたインスタンスは、あなたがGC'dを得ることから、それを防ぐために、あなたのRealmResultsにフィールド変数を保持する必要があります)

4.

を閉じられることはありません( ArrayAdapterもその上にラッチし、そうかもしれませんが、あなたが問題に実行されないこと からではありません結果にフィールド変数を保持します)

+0

WoW..great ..あなたの貴重な提案に感謝します。私はこのポストに混乱のもう一つの点を追加しました。それを確認してください? –

+0

私はパラメータPersonDetailsModel pを持っています。しかし、myRealm.createObject(PersonDetailsModel.class)を使用して領域オブジェクトを作成しています。 pからデータを取得してpersonに設定します。 createObject()にパラメータpを直接設定する方法はありませんか? –

+0

いいえ、このメソッドを使用する場合は、 'createObject(PersonDetailsModel.class、primaryKey)'を指定する必要があります。私はinsertOrUpdate()を使用する傾向がありますが、挿入されたすべてのレルムオブジェクトに1つの分離コピーを使用する傾向があります – EpicPandaForce

関連する問題