Android:如何使用Parse.com的Bolts同步查询?

Chr*_*ris 8 java android parse-platform bolts-framework local-datastore

Parse.com用作我的应用程序的后端.他们还提供了一个本地数据库来存储信息,作为替代SQLite.

我想通过解析将电话号码添加到我的数据库中.在添加数字之前,我需要检查数据中是否已存在该数字,因此我findInBackground()用来获取与我想要添加的数字相匹配的数字列表.如果列表为空,则我想要添加的数字在数据库中不存在.

执行此操作的方法是:

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

                                               Log.d(TAG,"Person:"+phoneNumber+" was added.");
                                           } else {
                                               Log.d(TAG, "Warning: " + "Person with the number " + phoneNumber + " already exists.");
                                           }
                                       } else {
                                           Log.d(TAG, "Error: " + e.getMessage());
                                       }
                                   }
                               }
        );
    }
Run Code Online (Sandbox Code Playgroud)

然后我调用此方法3次以添加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
Run Code Online (Sandbox Code Playgroud)

请注意,第三个数字与第一个数字相同,不应将其添加到数据库中.但是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.
Run Code Online (Sandbox Code Playgroud)

第三个数字被添加,即使它不应该这样做,因为fintInBackground()它几乎同时在3个后台线程中运行,所以它会发现数据库中没有像我想要添加的那样的数字.

这个问题中,一个人告诉我,我应该使用BoltsParse.我从这里和一些Parse博客文章中读到了它,但我不完全理解如何使用我已经拥有的方法,以及如何同步查询要一个接一个地执行.

如果有人使用此库,请指导我如何执行此操作或提供一些基本示例,以便我了解工作流程.

谢谢!

Sed*_*lat 0

您应该在将重复记录保存到数据库之前删除它们。使用HashSet和创建一个 person 对象并重写它的equals()hashCode()方法将解决重复记录问题。电话号码是唯一的值,因此如果电话号码与其他号码相同,我们应该只保存其中一个。这意味着您应该仅使用字段来覆盖对象equals()hashCode()方法。Personphone

public class Person {
    private String name;
    private String phone;
    private boolean isFav;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public boolean isFav() {
        return isFav;
    }

    public void setFav(boolean isFav) {
        this.isFav = isFav;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((phone == null) ? 0 : phone.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (phone == null) {
            if (other.phone != null)
                return false;
        } else if (!phone.equals(other.phone))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", phone=" + phone + ", isFav=" + isFav + "]";
    }
}
Run Code Online (Sandbox Code Playgroud)

测试:

public static void main(String[] args) {

    HashSet<Person> persons = new HashSet<Person>();

    Person person;

    person = new Person();
    person.setName("Joe");
    person.setPhone("+199999");
    person.setFav(false);
    persons.add(person);

    person = new Person();
    person.setName("Jessie");
    person.setPhone("+133333");
    person.setFav(false);
    persons.add(person);

    person = new Person();
    person.setName("Johnny");
    person.setPhone("+199999");
    person.setFav(false);
    persons.add(person);

    System.out.println(persons);
}
Run Code Online (Sandbox Code Playgroud)

印刷:

[人[姓名=Joe,电话=+199999,isFav=false],人[姓名=Jessie,电话=+133333,isFav=false]]

HashSet 包含Person具有唯一电话号码的对象。约翰尼与乔有相同的电话号码,因此HashSet拒绝将约翰尼添加到列表中。

另外添加CallBack方法putPerson()将帮助您解决失败的固定操作。

person.pinInBackground( new SaveCallback() {

    @Override
    public void done( ParseException e ) {
        if( e == null ) {
            pinnedPersonList.add(person)
        } else {
            unPinnedPersonList.add(person)
        }
    }
} );
Run Code Online (Sandbox Code Playgroud)