【问题标题】:cannot add column with 'put' method in Parse database无法在 Parse 数据库中使用“put”方法添加列
【发布时间】:2016-01-03 17:59:41
【问题描述】:

我正在使用 Parse 开发实时消息应用程序,并希望在 ListView 中显示所有用户。所以我也想参考用户是在线还是离线,我尝试了“put”方法来添加名为“online”的列并放置有关它的信息。当它出错时,我自己添加了该列,但它仍然不起作用。这是我在 UserList 类中尝试过的:

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseUser;

import java.util.ArrayList;
import java.util.List;

public class UserList extends AppCompatActivity {
     public static ArrayList<ParseUser> userList;
     public static String TAG = "UserList";
     public static ParseUser user = new ParseUser();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_user_list);
    updateUserStatus(true);

}
@Override
protected void onDestroy() {
    super.onDestroy();
    updateUserStatus(false);
}
@Override
protected void onResume() {
    super.onResume();
    loadUserList();
}
private void updateUserStatus(boolean isOnline) {
    user.put("online", isOnline);
    user.saveEventually();
    //System.out.println("getBoolean's result : " + user.getBoolean("online"));
}
private void loadUserList() {
    ParseUser.getQuery().whereNotEqualTo("username", user.getUsername()).findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> objects, ParseException e) {
            if (objects != null) {
                if (objects.size() == 0) System.out.println("No user found");
                userList = new ArrayList<>(objects);
                ListView list = (ListView) findViewById(R.id.userList);
                list.setAdapter(new UserAdapter(UserList.this));
                list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        startActivity(new Intent(UserList.this, MainActivity.class));
                        finish();
                    }
                });
            }
            else {
                System.out.println("exception detected while loading user list");
                e.printStackTrace();
            }
        }
    });
  }
}

UserAdapter 类:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.parse.ParseUser;

public class UserAdapter extends BaseAdapter {
    public static String TAG = "UserAdapter";
    public TextView labelname;
    LayoutInflater layoutInflater;

public UserAdapter(Context context){
    layoutInflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    return UserList.userList.size();
}
@Override
public ParseUser getItem(int index) {
    return UserList.userList.get(index);
}
@Override
public long getItemId(int index) {
    return index;
}
@Override
public View getView(int pos, View v, ViewGroup group) {
       ParseUser c = getItem(pos);
        if (v == null) {
            v = layoutInflater.inflate(R.layout.chat_item, null);
        }
        labelname = (TextView) v;
        labelname.setText(c.getUsername());
        labelname.setCompoundDrawablesWithIntrinsicBounds(c.getBoolean("online") ? R.drawable.ic_online
                : R.drawable.ic_offline, 0, R.drawable.arrow, 0);

    return v;
   }
}

我用 SaveCallback 尝试了 saveInBackground,但它抛出异常,名为:

原因:java.lang.IllegalArgumentException:在 ParseUser 注册之前无法保存它。先来电注册

但我比 1 小时前更困惑。我在另一个班级授权我的用户,这似乎没有问题。

【问题讨论】:

    标签: android database parse-platform database-connection


    【解决方案1】:

    这是Parse 的开放错误。可能还没有解决。 look at thisthis 也是。

    saveInBackground()代替saveEventually()

    你不能那样做

    ParseUser user = new ParseUser();
    

    如果你想要登录用户而不是这样

    ParseUser user = ParseUser.getCurrentUser();
    

    在获得登录用户之前,您必须先注册

    【讨论】:

    • 那么,我现在该怎么办?我查看了基于 Parse 的 messenger 演示,它使用了 'put' 方法,效果很好。我很困惑。
    • 你可以使用saveInBackground()
    • 你的意思是“user.saveInBackground();”调用“put”方法后,是吗?我试试看。
    • 它不工作。我也试过了,也用 SaveCallback。但它会引发异常,我将编辑我的帖子以向您展示。
    • 天哪,它有效!谢谢你。如果出现问题,我会发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2014-12-23
    • 2013-10-06
    • 2021-08-31
    相关资源
    最近更新 更多