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个后台线程中运行,所以它会发现数据库中没有像我想要添加的那样的数字.
在这个问题中,一个人告诉我,我应该使用Bolts库Parse.我从这里和一些Parse博客文章中读到了它,但我不完全理解如何使用我已经拥有的方法,以及如何同步查询要一个接一个地执行.
如果有人使用此库,请指导我如何执行此操作或提供一些基本示例,以便我了解工作流程.
谢谢!
您应该在将重复记录保存到数据库之前删除它们。使用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)
| 归档时间: |
|
| 查看次数: |
1052 次 |
| 最近记录: |