2016-08-23 2 views
1

Я решил использовать Realm в одном из моих приложений для Android. Вот почему я просто пытаюсь сделать простое приложение с Realm для R & D цели. Но я смущен, если это правильный способ использования Королевства. Мой проект работает и показывает данные правильно. Вот мой codes-Это правильный подход к использованию Realm в Android?

Я создал класс 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 класс 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"; 
    } 
} 

Это 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 class-

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

Is 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. Но я создаю объект realm используя 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) вы не должны делать "Применение" экземпляры вручную, "Application" создан Android

0.b) Ваш public RealmResults getAllData() { должен быть public RealmResults<PersonDetailsModel> getAllData() {

1.) вы не используете RealmBaseAdapter и вы должны, потому что в данный момент вы не обрабатываете обновления в области либо с RealmBaseAdapter, ни с RealmChangeListener

2.) вы не используете executeTransactionAsync() в потоке пользовательского интерфейса, и вы должны (на самом деле, вы должны использовать executeTransaction() для синхронных операций, и вы не должны выполнять синхронную запись на потоке пользовательского интерфейса)

3.) ваш Realm экземпляр, созданный в MainActivity, никогда не закрыт

4.) вы должны сохранить переменную поля в своем RealmResults, чтобы предотвратить ее получение GC'd (хотя ArrayAdapter может также защелкнуться на нем, так что вы не столкнетесь с проблемой, исходит от не, сохраняя переменную поля к результатам)

+0

WoW..great..thanks для вашего ценного предложения. Я добавил еще одну путаницу в этом посте. Пожалуйста, проверьте это? –

+0

У меня есть параметр PersonDetailsModel p. Но я создаю объект realm, используя myRealm.createObject (PersonDetailsModel.class); а затем получить данные из p и установить его для человека. Нет ли способа напрямую установить параметр p в createObject()? –

+0

Нет, но вы должны указать 'createObject (PersonDetailsModel.class, primaryKey)', если вы используете этот метод. Я обычно использую 'insertOrUpdate()', хотя используя 1 отдельную копию для всех вставленных объектов области – EpicPandaForce

Смежные вопросы