使用 Realm 执行事务方法会在每次运行 android 上继续循环



在我的应用程序中,我使用 Realm DB 将所有数据存储在本地数据库中。我有一些初始模拟数据,我想在应用程序开始时显示。 以前我实现了begintransaction方法。但是在阅读文档后,我已经暗示了执行转换方法。因为这种方法很容易更新我的新数据。现在的问题是,每当我单击显示回收器视图的选项时,数据每次都会循环。例如,我有 3 个数据。如果我回到上一页,然后再次转到这个回收器视图页面,它会变成双倍,下次它会变成 tripple,依此类推。我只想在视图中显示更新的数据。就像如果我添加第 4 个数据一样,我想将其显示到回收器视图。如何在我的应用程序中停止每次运行时循环。

这是我的代码

"人员"页面

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

添加更改侦听器

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

这是因为在onCreate()中,您运行basicCRUD(personRealm);添加新的人员模型

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()时,它将是一个具有不同主键的新对象,并入。如果它只是12等等,那么它会将它们更新为同一对象。

值得庆幸的是,Realm 在RealmConfiguration.Builder()上提供了initialData(Realm.Transaction)方法,它允许您仅在首次创建数据库时创建数据库的初始数据,或者在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());

编辑:

要仅在一个"初始数据">

中提供多个"初始数据"(因为您提供 1 个事务(,您可以依靠composite design pattern在一个初始数据中提供多个初始数据,如下所示

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

最新更新