0

私のアプリケーションでは、Realm DBを使用してすべてのデータをローカルデータベースに格納しています。私はアプリの開始時に見せたい最初の模擬データを持っています。以前はbegintransactionメソッドを実装していました。しかし、ドキュメンテーションを読んだ後、私はトランスラクションメソッドを実行することを意味しています。このメソッドを使用すると、新しいデータを簡単に更新できます。問題は、私がrecyclerviewを表示するオプションをクリックするたびに、データが毎回ループしていることです。たとえば私は3つのデータを持っています。前のページに戻って、このrecyclerviewページに再度行くと、二重になり、次回はそれが三角形になるなどします。私はビューに更新されたデータだけを表示したい。もし私が4番目のデータを追加したら、これをrecyclerviewに示すのと同じように。私のアプリで実行するたびにループを止める方法はありますか?ここでレルムを使用してトランザクションメソッドを実行すると、各実行時にループし続けます。

が私のコードである

パーソンページ

public class InitialData implements Realm.Transaction { 
@Override 
public void execute(Realm realm) { 
    List<PersoneModel> person = new ArrayList<>(); 
    PersonModel model = new PersonModel(); 
    model.setId(1 + System.currentTimeMillis()); 
    model.setName("Name1"); 
    model.setCompany("Comapny1"); 
    model.setTitle("Title1"); 
    person.add(model); 

    model = new PersonModel(); 
    model.setId(2 + System.currentTimeMillis()); 
    model.setName("Name2"); 
    model.setCompany("Company2"); 
    model.setTitle("Title2"); 
    person.add(model); 

    model = new PersonModel(); 
    model.setId(2 + System.currentTimeMillis()); 
    model.setName("Name2"); 
    model.setCompany("Company2"); 
    model.setTitle("Title2"); 
    person.add(model); 

    model = new PersonModel(); 
    model.setId(3 + System.currentTimeMillis()); 
    model.setName("Name3"); 
    model.setCompany("Comapny3"); 
    model.setTitle("Title3"); 
    person.add(model); 

    for (PersonModel realmModel : colleague) { 
     realm.insertOrUpdate(realmModel); 
    } 
} 

@Override 
public boolean equals(Object obj) { 
    return obj != null && obj instanceof InitialData; 
} 

@Override 
public int hashCode() { 
    return InitialData.class.hashCode(); 
} 

}

ニュースページデータ

public class InitialDataNews implements Realm.Transaction { 
    @Override 
    public void execute(Realm realm) { 
    List<NewsModel> newsItem = new ArrayList<>(); 
    NewsModel model = new NewsModel(); 

    model.setId(1+System.currentTimeMillis()); 
    model.setImage(R.drawable.image1); 
    model.setTitle("title1"); 
    model.setDate("12.07.2017"); 
    model.setDetail("deascription"); 
    newsItem.add(model); 


    model = new NewsModel(); 
    model.setId(3+System.currentTimeMillis()); 
    model.setImage(R.drawable.image3); 
    model.setTitle("title2"); 
    model.setDate("05.05.2017"); 
    model.setDetail("description"); 
    newsItem.add(model); 

    model = new NewsModel(); 
    model.setId(4+System.currentTimeMillis()); 
    model.setImage(R.drawable.image4); 
    model.setTitle("title3"); 
    model.setDate("13.04.2017"); 
    model.setDetail("description3"); 
    newsItem.add(model); 


    ..... 


    for (NewsModel realmModel : newsItem) { 
    realm.insertOrUpdate(realmModel); 
    } 
} 
@Override 
public boolean equals(Object obj) { 
    return obj != null && obj instanceof InitialData; 
} 

@Override 
public int hashCode() { 
    return InitialData.class.hashCode(); 
    } 

を}イニシャル

ベースのアプリケーション

@Override 
public void onCreate() { 
    super.onCreate(); 
    // The Realm file will be located in Context.getFilesDir() with name "default.realm" 
    //Here we setup the realm configuration. 
    //Setting a default configuration in custom Application class, will ensure that it is available in the rest of the code. 
    Realm.init(this); 
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder() 
     .deleteRealmIfMigrationNeeded() 
     .initialData(CompositeInitialData.of(new InitialDataNews(), new InitialData()).build()); 
    Realm.setDefaultConfiguration(realmConfiguration); 
    } 

追加変更リスナーonCreate()に、あなたは追加basicCRUD(personRealm);を実行しているためだ

public class PersonPage extends AppCompatActivity implements PersonAdapter.PersonListListener{ 

private RecyclerView recyclerView; 
private PersonAdapter adapter; 
private Realm PersonRealm; 
private RealmResults<PersoneModel> personResult; 

private RealmChangeListener realmListener; 


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


    personRealm = Realm.getDefaultInstance(); 
    recyclerView = (RecyclerView) findViewById(R.id.colleagues_recycler); 

    realmListener=new RealmChangeListener() { 
     @Override 
     public void onChange(Object o) { 
      showAllPersons(); 
     }}; 
    colleagueRealm.addChangeListener(realmListener); 

    setUpRecycler(); 
    } 

private void showAllPersons() { 
    realmResult = personRealm.where(PersonModel.class).findAllAsync(); 
    setAdapter(realmResult); 
    adapter.notifyDataSetChanged(); 
} 

private void setAdapter(RealmResults<PersonModel> results) { 

    adapter = new PersonAdapter(this, personRealm.where(PersonModel.class).findAllSortedAsync("id"),this); 
    recyclerView.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 
} 
+0

はあなたcraetedクラス '新しいInitialDataは()'や '新しいInitialDataPersons()'またはそのような何かを持って提供することができますこの方法? – EpicPandaForce

+0

人のための@EpicPanda私のクラス名はInitialDataです。 –

+0

質問を更新することをお勧めします – EpicPandaForce

答えて

0

新しい人モデル

  PersonModel model = new PersonModel(); 
      model.setId(1 + System.currentTimeMillis()); 
      model.setName("Name1"); 
      model.setCompany("Comapny1"); 
      model.setTitle("Title1"); 
      person.add(model); 

IDを1 + System.currentTimeMillis()と設定すると、別の主キーを持つ新しいオブジェクトになり、挿入されます。それがちょうど1だったら、2などであれば、同じオブジェクトとしてそれらを更新します。

ありがたいことに、RealmはinitialData(Realm.Transaction) method on the RealmConfiguration.Builder()を提供しています。initialData(Realm.Transaction) method on the RealmConfiguration.Builder()を使用すると、データベースが初めて作成されたとき、またはdeleteRealmIfMigrationNeeded()の後にデータが削除されたときにのみデータベースの初期データを作成できます。

public class InitialData implements Realm.Transaction { 
    @Override 
    public void execute(Realm realm) { 
     List<PersonModel> person = new ArrayList<>(); 
     PersonModel model = new PersonModel(); 
     model.setId(1 + System.currentTimeMillis()); 
     model.setName("Name1"); 
     model.setCompany("Comapny1"); 
     model.setTitle("Title1"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(2 + System.currentTimeMillis()); 
     model.setName("Name2"); 
     model.setCompany("Company2"); 
     model.setTitle("Title2"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(3 + System.currentTimeMillis()); 
     model.setName("Name3"); 
     model.setCompany("Company23"); 
     model.setTitle("Title3"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(4 + System.currentTimeMillis()); 
     model.setName("Name4"); 
     model.setCompany("Comapny4"); 
     model.setTitle("Title4"); 
     person.add(model); 

     for (PersonModel realmModel : person) { 
      realm.insertOrUpdate(realmModel); 
     } 
    } 

    @Override 
    public boolean equals(Object object) { 
     return object != null && object instanceof InitialData; 
    } 

    @Override 
    public int hashCode() { 
     return InitialData.class.hashCode(); 
    } 
} 

そして

Realm.init(this); 
Realm.setDefaultConfiguration(new RealmConfiguration.Builder() 
            .deleteRealmIfMigrationNeeded() 
            .initialData(new InitialData()) 
            .build()); 

EDIT:

唯一の "初期データ" 内に複数の "初期件のデータを"(あなたは1つのトランザクションを提供して)を提供するために、あなたが頼ることができますcomposite design patternを使用して、1つの初期データで複数の初期データを提供するようにしてください。

public final class InitialDataPersons implements Realm.Transaction { 
    @Override 
    public void execute(Realm realm) { 
     List<PersonModel> person = new ArrayList<>(); 
     PersonModel model = new PersonModel(); 
     model.setId(1 + System.currentTimeMillis()); 
     model.setName("Name1"); 
     model.setCompany("Comapny1"); 
     model.setTitle("Title1"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(2 + System.currentTimeMillis()); 
     model.setName("Name2"); 
     model.setCompany("Company2"); 
     model.setTitle("Title2"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(3 + System.currentTimeMillis()); 
     model.setName("Name3"); 
     model.setCompany("Company23"); 
     model.setTitle("Title3"); 
     person.add(model); 

     model = new PersonModel(); 
     model.setId(4 + System.currentTimeMillis()); 
     model.setName("Name4"); 
     model.setCompany("Comapny4"); 
     model.setTitle("Title4"); 
     person.add(model); 

     for (PersonModel realmModel : person) { 
      realm.insertOrUpdate(realmModel); 
     } 
    } 

    @Override 
    public boolean equals(Object object) { 
     return object != null && object instanceof InitialDataPersons; 
    } 

    @Override 
    public int hashCode() { 
     return InitialDataPersons.class.hashCode(); 
    } 
} 

public final class InitialDataNews implements Realm.Transaction { 
    @Override 
    public void execute(Realm realm) { 
     List<NewsModel> newsItem = new ArrayList<>(); 
     NewsModel model = new NewsModel(); 

     model.setId(1+System.currentTimeMillis()); 
     model.setImage(R.drawable.image1); 
     model.setTitle("title1"); 
     model.setDate("12.07.2017"); 
     model.setDetail("deascription"); 
     newsItem.add(model); 

     model = new NewsModel(); 
     model.setId(3+System.currentTimeMillis()); 
     model.setImage(R.drawable.image3); 
     model.setTitle("title2"); 
     model.setDate("05.05.2017"); 
     model.setDetail("description"); 
     newsItem.add(model); 

     model = new NewsModel(); 
     model.setId(4+System.currentTimeMillis()); 
     model.setImage(R.drawable.image4); 
     model.setTitle("title3"); 
     model.setDate("13.04.2017"); 
     model.setDetail("description3"); 
     newsItem.add(model); 

     ..... 

     for (NewsModel realmModel : newsItem) { 
      realm.insertOrUpdate(realmModel); 
     } 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return obj != null && obj instanceof InitialDataNews; 
    } 

    @Override 
    public int hashCode() { 
     return InitialDataNews.class.hashCode(); 
    } 
} 

public final class CompositeInitialData implements Realm.Transaction { 
    private final Realm.Transaction[] transactions; 

    private CompositeInitialData(Realm.Transaction... transactions) { // `of` is prettier 
     this.transactions = transactions; 
    } 

    public static CompositeInitialData of(Realm.Transaction... transactions) { 
     return new CompositeInitialData(transactions); 
    } 

    @Override 
    public void execute(Realm realm) { 
     for(Realm.Transaction transaction : transactions) { 
      transaction.execute(realm); 
     } 
    } 

    @Override 
    public boolean equals(Object obj) { 
     return obj != null && obj instanceof CompositeInitialData; // you might want autogenerated equals instead 
    } 

    @Override 
    public int hashCode() { 
     return CompositeInitialData.class.hashCode(); // you might want autogenerated hashCode instead 
    } 
} 

あなたは

Realm.init(this); 
Realm.setDefaultConfiguration(new RealmConfiguration.Builder() 
      .deleteIfMigrationNeeded() 
      .initialData(CompositeInitialData.of(new InitialDataNews(), new InitialDataPersons())) 
      .build()); 
+0

しかし、私はこのように初期データを暗示したくありません。私はいくつかの初期データを持っている別のページを持っているので。これを行う別の方法はありますか?また、私はこのための任意のクラスを作成したくない –

+0

EpicPanda申し訳ありませんが、あなたが使用している言語は、それは私の期待stackoverflowからではありません。私は初期データで試した。私は初期データとして2つのデータを持っています。そしてこのようにして私はこの問題に対処できません。おそらくあなたのような人々にとっては "エキスパートデベロッパー"の方が簡単です。 –

+0

はい。しかし、私が直面している問題は、構成上の2つの初期データを区別することができません。これを避けるために、私はメインのactivitでpublic void basicCRUD(Realm realm)を作成し、oncreateメソッドを呼び出しました。私は最初の2つのデータ、personinitilaデータとニュース初期データを持っています。私は設定で2つのinitilaデータを解読するどんな源も見つけていません –

関連する問題