gpt4 book ai didi

java - Android:Parse.com 与 findInBackground() 的并发问题

转载 作者:行者123 更新时间:2023-12-01 10:40:06 24 4
gpt4 key购买 nike

我使用 Parse.com 作为我的应用程序的后端。 Parse 的本地数据库看起来非常好用,所以我决定使用它。

我想创建一个包含名称电话号码的数据库。这很简单,只需创建一个 new ParseObjectpinInBackground() 即可。但当我想删除重复的数字时,情况就更复杂了。首先我需要搜索数据库中是否已存在该号码,如果不存在则添加新号码。

执行此操作的方法是:

 public void putPerson(final String name, final String phoneNumber, final boolean isFav) {

// Verify if there is any person with the same phone number
ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseClass.PERSON_CLASS);
query.whereEqualTo(ParseKey.PERSON_PHONE_NUMBER_KEY, phoneNumber);
query.fromLocalDatastore();
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> personList,
ParseException e) {
if (e == null) {
if (personList.isEmpty()) {
// If there is not any person with the same phone number add person
ParseObject person = new ParseObject(ParseClass.PERSON_CLASS);
person.put(ParseKey.PERSON_NAME_KEY, name);
person.put(ParseKey.PERSON_PHONE_NUMBER_KEY, phoneNumber);
person.put(ParseKey.PERSON_FAVORITE_KEY, isFav);

person.pinInBackground();
} else {
Log.d(TAG, "Warning: " + "Person with the number " + phoneNumber + " already exists.");
}
} else {
Log.d(TAG, "Error: " + e.getMessage());
}
}
}
);

}

假设我想在数据库中添加 3 个人:

    ParseLocalDataStore.getInstance().putPerson("Jack", "0741234567", false);
ParseLocalDataStore.getInstance().putPerson("John", "0747654321", false);
ParseLocalDataStore.getInstance().putPerson("Jack", "0741234567", false);
ParseLocalDataStore.getInstance().getPerson(); // Get all persons from database

请注意,第一个人和第三个人有相同的编号,因此第三个人不会被添加到数据库中,但是...

此后的logcat是:

12-26 15:37:55.424 16408-16408/D/MGParseLocalDataStore: Person:0741234567 was added.
12-26 15:37:55.424 16408-16408/D/MGParseLocalDataStore: Person:0747654321 was added.
12-26 15:37:55.484 16408-16408/D/MGParseLocalDataStore: Person:0741234567 was added.
12-26 15:37:55.494 16408-16408/D/MGParseLocalDataStore: Person database is empty

logcat 的最后一行来自显示数据库中所有人员的方法:

public void getPerson() {
ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseClass.PERSON_CLASS);
query.fromLocalDatastore();
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> personList,
ParseException e) {
if (e == null) {
if (personList.isEmpty()) {
Log.d(TAG, "Person database is empty");
} else {
for (ParseObject p : personList) {
Log.d(TAG, p.getString(ParseKey.PERSON_PHONE_NUMBER_KEY));
}
}
} else {
Log.d(TAG, "Error: " + e.getMessage());
}

}
});
}

所以有两个问题:

  1. 即使我检查第三个数字是否已存在,也会添加第三个数字。

  2. 显示所有人的方法告诉我,即使在 logcat 中我可以看到它添加了 3 个人,我的数据库中也没有任何内容。

我认为问题是 findInBackground() 方法在另一个线程中完成所有工作。这个问题有办法解决吗?

最佳答案

您的两个问题都是异步工作的结果。如果您调用 putPerson 方法两次,它们将几乎同时在单独的后台线程中运行,并且两个查找查询很可能几乎同时返回,而且绝对是在第一次调用保存之前新人。

在您的示例中,getPerson 调用将在后台线程也能够拯救您的三个人之前返回。

您的问题与 Parse 或 localDataStore 并不真正相关,而是一个典型的并发问题。您需要重新考虑如何处理应用程序中的并发性。

只要这只是一个局部问题,您就可以强加同步结构,即 Bolts Framework (自从您使用 Parse 以来,它已经是您应用程序的一部分)。但是,如果在多个地方调用 addPerson,您将始终面临此问题,并且必须找到其他解决方案或变通方法来处理并发。

并发是一个大话题,您应该花一些时间研究。

关于java - Android:Parse.com 与 findInBackground() 的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34472000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com