从 BackendlessUser getProperty() 获取零个对象
getting zero objects from BackendlessUser getProperty()
我设置了 Backendless 应用程序,其中 User
table 具有行名称 posts
,这是 User
和 Post
之间的数据对象关系 tables,数据关系是1对多。当我尝试使用 BackendlessUser.getProperty("key")
检索它时,它 returns 零个对象。一旦它甚至返回 HashMap
。我使用了docs中提到的方式,但是由于Object[]
的大小为零,所以得到null。我肯定在那一行中有数据,为互联网写了 <uses-permission>
。
public class MainActivity extends AppCompatActivity {
BackendlessUser user = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Backendless.initApp(this, "app_id", "android_key", "v1");
Backendless.UserService.login("username", "password", new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
user = response;
doStuff();
}
@Override
public void handleFault(BackendlessFault fault) {
Log.e("Error logging in", "message: " + fault.getMessage());
}
});
}
//important
private void doStuff() {
Object[] postObjectArray = (Object[]) user.getProperty("posts");
Post[] posts = null;
if (postObjectArray != null && postObjectArray.length > 0)
posts = (Post[])postObjectArray;
if (posts == null)
{
Log.d("Problems", "posts is null");
}
}
}
Post
class:
public class Post extends Object{
private BackendlessUser user;
private String file;
private String message;
private String objectId;
public String getObjectId() {
return objectId;
}
public void setObjectId(String objectId) {
this.objectId = objectId;
}
public Post() {
}
public Post(BackendlessUser user, String file, String message) {
this.user = user;
this.file = file;
this.message = message;
}
public BackendlessUser getUser() {
return user;
}
public void setUser(BackendlessUser user) {
this.user = user;
}
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
原因是复选框 "autoload" 没有被选中,它加载了当拥有者 table 被加载时复选框对应的一对多关系的所有值。因此,user.getProperty("posts")
总是 returning null。但需要注意的是,如果行是数据对象关系,它return是HashMap<String, Object>
,所以Post需要有接受HashMap<String, Object>
的构造函数:
public Post(HashMap hashMap)
{
this.hashMap = hashMap;
property1 = (String)hashMap.get("property1");
/*other properties*/
}
如果没有值,它将return一个Object
,不是 castable任何其他类型,所以文档中使用的方式 必须 应用以修复边缘情况。
编辑:
在对 Backendless 进行任何调用之前 map data table to class 很有用。这样,可以消除所有使用 HashMap
的工作并直接获得所需的类型。尽管如此,如果您通过 Backendless.Persistence
检索数据,您可以将其指定为参数。
我设置了 Backendless 应用程序,其中 User
table 具有行名称 posts
,这是 User
和 Post
之间的数据对象关系 tables,数据关系是1对多。当我尝试使用 BackendlessUser.getProperty("key")
检索它时,它 returns 零个对象。一旦它甚至返回 HashMap
。我使用了docs中提到的方式,但是由于Object[]
的大小为零,所以得到null。我肯定在那一行中有数据,为互联网写了 <uses-permission>
。
public class MainActivity extends AppCompatActivity {
BackendlessUser user = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Backendless.initApp(this, "app_id", "android_key", "v1");
Backendless.UserService.login("username", "password", new AsyncCallback<BackendlessUser>() {
@Override
public void handleResponse(BackendlessUser response) {
user = response;
doStuff();
}
@Override
public void handleFault(BackendlessFault fault) {
Log.e("Error logging in", "message: " + fault.getMessage());
}
});
}
//important
private void doStuff() {
Object[] postObjectArray = (Object[]) user.getProperty("posts");
Post[] posts = null;
if (postObjectArray != null && postObjectArray.length > 0)
posts = (Post[])postObjectArray;
if (posts == null)
{
Log.d("Problems", "posts is null");
}
}
}
Post
class:
public class Post extends Object{
private BackendlessUser user;
private String file;
private String message;
private String objectId;
public String getObjectId() {
return objectId;
}
public void setObjectId(String objectId) {
this.objectId = objectId;
}
public Post() {
}
public Post(BackendlessUser user, String file, String message) {
this.user = user;
this.file = file;
this.message = message;
}
public BackendlessUser getUser() {
return user;
}
public void setUser(BackendlessUser user) {
this.user = user;
}
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
原因是复选框 "autoload" 没有被选中,它加载了当拥有者 table 被加载时复选框对应的一对多关系的所有值。因此,user.getProperty("posts")
总是 returning null。但需要注意的是,如果行是数据对象关系,它return是HashMap<String, Object>
,所以Post需要有接受HashMap<String, Object>
的构造函数:
public Post(HashMap hashMap)
{
this.hashMap = hashMap;
property1 = (String)hashMap.get("property1");
/*other properties*/
}
如果没有值,它将return一个Object
,不是 castable任何其他类型,所以文档中使用的方式 必须 应用以修复边缘情况。
编辑:
在对 Backendless 进行任何调用之前 map data table to class 很有用。这样,可以消除所有使用 HashMap
的工作并直接获得所需的类型。尽管如此,如果您通过 Backendless.Persistence
检索数据,您可以将其指定为参数。