2016-08-23 3 views
1

내 Android 앱 중 하나에 렘 영역을 사용하기로 결정했습니다. 그래서 Realm for R & D 목적으로 간단한 앱을 만들려고합니다. 그러나 그것이 영역을 사용하는 올바른 방법이라면 혼란 스럽습니다. 내 프로젝트가 제대로 작동하고 데이터가 올바르게 표시됩니다. Android에서 Realm을 사용하는 올바른 방법입니까?

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

이 지금은이 클래스의 인스턴스를 생성하고 방법을 사용하여 작업을 수행하고 : 여기

내가 자바 클래스를 RealmDB.java을 만들어 내 codes- 있습니다.

다음
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 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입니다 : 여기

내 영역 개체 클래스 PersonDetailsModel.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()에 설정하는 방법이 없습니까?

+0

예/아니오를 찾고 있습니까? ? 문제가 무엇입니까? 작동합니까?또는 누군가가 코드를 검토하고 잠재적으로 코드를 리팩터링하기를 원하십니까? –

+0

필자는 개인적으로'rdb.getAllData()'를 변수에 저장해야 데이터베이스에 계속 질의를하지는 않지만 어떤 것도 잘못 본 것 같지는 않다. –

+0

예 ..이 방법이 효과적이다. 하지만 올바른 방법으로 구현하고 있는지 확신 할 수 없습니다. 누군가가 내 접근 방식을 검토하고 뭔가 잘못하고 있다고 제안하길 원합니다. –

답변

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

이 두 라인을 바탕으로, 나는 그것이 아니라는 것을 아주 명확하게 알 수 있습니다. 당신은 "응용 프로그램"인스턴스 손으로해서는 안

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

와우. 좋은 ... 감사합니다. 나는이 게시물에 혼란의 한 지점 더 추가했습니다. 그걸 확인해 주시겠습니까? –

+0

PersonDetailsModel p 매개 변수가 있습니다. 하지만 myRealm.createObject (PersonDetailsModel.class)를 사용하여 영역 객체를 만들었습니다. 그런 다음 p에서 데이터를 가져 와서 사람에게 설정합니다. createObject()에 매개 변수 p를 직접 설정하는 방법이 없습니까? –

+0

아니요,하지만이 메소드를 사용하려면'createObject (PersonDetailsModel.class, primaryKey)'를 지정해야합니다. InsertOrUpdate()를 사용하는 경향이 있습니다. 삽입 된 모든 영역 객체에 1 개의 분리 복사본을 사용하는 경향이 있습니다. – EpicPandaForce

관련 문제