Как проверить, существует ли элемент в таблице DynaModb?

Я делаю приложение для Android с входом через facebook и пользовательской регистрацией. Я использую AWS dynamodb для хранения пользовательских данных.

Я могу хранить данные из facebook и пользовательской регистрации, но не могу сканировать эти данные. На самом деле я хочу, чтобы всякий раз, когда пользователь возвращается для входа в систему со своими учетными данными, либо пользовательскими, либо Facebook, приложение должно проверять, присутствуют ли введенные поля в таблице или нет. Если он недоступен, приложение сначала попросит пользователя зарегистрироваться.

Основное действие

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    Button login;
    TextView signup;
    TextView help;
    EditText etUsername;
    EditText etPassword;
    String email;
    String pass;

    String email1;
    String pass1;
    private CognitoCachingCredentialsProvider credentialsProvider;

    private CallbackManager callbackManager;
    private LoginButton loginButton;
    private ImageButton btnLoginFb;
    private ProgressDialog progressDialog;
    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        etUsername = (EditText) findViewById(R.id.etUsername);

        etPassword = (EditText) findViewById(R.id.etPassword);

        login = (Button) findViewById(R.id.loginbutton);
        signup = (TextView) findViewById(R.id.textViewsignup);
        help = (TextView) findViewById(R.id.textViewHelp);
        etUsername = (EditText) findViewById(R.id.etUsername);
        etPassword = (EditText) findViewById(R.id.etPassword);
        login.setOnClickListener(this);
        signup.setOnClickListener(this);
        help.setOnClickListener(this);

        Context mContext = this.getApplicationContext();
        credentialsProvider = new CognitoCachingCredentialsProvider(
                mContext, // get the context for the current activity
                "us-east-1:*******************************",
                Regions.US_EAST_1
        );

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.loginbutton:
                email = etUsername.getText().toString();
                pass = etPassword.getText().toString();

                AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(credentialsProvider);
                DynamoDBMapper mapper = new DynamoDBMapper(ddbClient);



                if (email != null && pass != null) {

                        Intent slideactivity = new Intent(MainActivity.this, Welcome.class);

                        Bundle bndlanimation =
                                ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.animation, R.anim.animation2).toBundle();
                        startActivity(slideactivity, bndlanimation);
                    return;
                }                     
                else {
                    AlertDialog alertDialog = new AlertDialog.Builder(
                            MainActivity.this).create();

                    // Setting Dialog Title
                    alertDialog.setTitle("Oops");

                    // Setting Dialog Message
                    alertDialog.setMessage("No data found. You have to signup first!!!");

                    // Setting Icon to Dialog
                    //alertDialog.setIcon(R.drawable.tick);

                    // Setting OK Button
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // Write your code here to execute after dialog closed
                            startActivity(new Intent(MainActivity.this, SignUp.class));
                        }
                    });

                    // Showing Alert Message
                    alertDialog.show();

                }
                break;
            case R.id.textViewsignup:
                Intent slideactivity = new Intent(MainActivity.this, SignUp.class);

                Bundle bndlanimation =
                        ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.animation, R.anim.animation2).toBundle();
                startActivity(slideactivity, bndlanimation);

                break;

            case R.id.textViewHelp:
                Intent slideactivity1 = new Intent(MainActivity.this, LoginHelp.class);

                Bundle bndlanimation1 =
                        ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.animation, R.anim.animation2).toBundle();
                startActivity(slideactivity1, bndlanimation1);

                break;
        }

    }

    @Override
    protected void onResume() {
        super.onResume();


        callbackManager = CallbackManager.Factory.create();

        loginButton = (LoginButton) findViewById(R.id.login_button);

        loginButton.setReadPermissions("public_profile", "email", "user_friends");

        btnLoginFb = (ImageButton) findViewById(R.id.btnLoginFb);
        btnLoginFb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setMessage("Loading...");
                progressDialog.show();

                loginButton.performClick();

                loginButton.setPressed(true);

                loginButton.invalidate();

                loginButton.registerCallback(callbackManager, mCallBack);

                loginButton.setPressed(false);

                loginButton.invalidate();

            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }


    private FacebookCallback<LoginResult> mCallBack = new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {

            progressDialog.dismiss();

            // App code
            GraphRequest request = GraphRequest.newMeRequest(
                    loginResult.getAccessToken(),
                    new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(
                                JSONObject object,
                                GraphResponse response) {

                            Log.e("response: ", response + "");

                            try {

                                user = new User();
                                user.facebookID = object.getString("id").toString();
                                pass = user.facebookID;
                                Log.e(pass, "id");
                                user.email = object.getString("email").toString();
                                email = user.email;
                                Log.e(email, "email");
                                user.name = object.getString("name").toString();
                                user.gender = object.getString("gender").toString();
                                PrefUtils.setCurrentUser(user, MainActivity.this);

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            Toast.makeText(MainActivity.this, "welcome " + user.name, Toast.LENGTH_LONG).show();
                            Intent intent = new Intent(MainActivity.this, Welcome.class);
                            startActivity(intent);
                            finish();

                        }

                    });

            Bundle parameters = new Bundle();
            parameters.putString("fields", "id,name,email,gender, birthday");
            request.setParameters(parameters);
            request.executeAsync();
            new db().execute("");

        }

        @Override
        public void onCancel() {
            progressDialog.dismiss();
        }

        @Override
        public void onError(FacebookException e) {
            progressDialog.dismiss();
        }
    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private class db extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(credentialsProvider);
            DynamoDBMapper mapper = new DynamoDBMapper(ddbClient);
            Item item = new Item();
            mapper.load(Item.class, email, pass);
            if(item==null)
            {
                startActivity(new Intent(MainActivity.this,SignUp.class));
            }
            else{
                item.setEmail(email);
                item.setPass(pass);
                mapper.save(item);
                startActivity(new Intent(MainActivity.this,Welcome.class));
            }
           mapper.load(Item.class, email,pass);
           if(item==null)           {
                startActivity(new Intent(MainActivity.this,SignUp.class));
          }
            else{
               startActivity(new Intent(MainActivity.this,Welcome.class));
           }
            return "Executed";
        }

        @Override
        protected void onPostExecute(String result) {

        }

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected void onProgressUpdate(Void... values) {
        }
    }

Логкат: -

java.lang.RuntimeException: произошла ошибка при выполнении doInBackground() в android.os.AsyncTask$3.done(AsyncTask.java:309) в java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) в java. util.concurrent.FutureTask.setException(FutureTask.java:223) в java.util.concurrent.FutureTask.run(FutureTask.java:242) в android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) в java.lang.Thread.run(Thread.java:818) Причина: com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: найден нулевой ключ для общедоступного java.lang.String com.ediode.graphics3d.Item.getEmail() в com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.getKey (Динамо DBMapper.java:434) на com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load(DynamoDBMapper.java:387) на com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load(DynamoDBMapper.java:466) на com .amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load(DynamoDBMapper.java:350) по адресу com.ediode.graphics3d.MainActivity$db.doInBackground(MainActivity.java:339) по адресу com.ediode.graphics3d.MainActivity$db.doInBackground (MainActivity.java:333) в android.os.AsyncTask$2.call(AsyncTask.java:295) в java.util.concurrent.FutureTask.run(FutureTask.java:237)             в android.os.AsyncTask$SerialExecutor$1. run(AsyncTask.java:234)            в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)             в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)      lang        в java. .Thread.run(Thread.java:818)

Я застрял на этом с 4,5 часов. Было бы здорово, если бы кто-нибудь мог помочь мне в этом.

Спасибо


person User0706    schedule 07.12.2015    source источник
comment
DynamoDB — это, по сути, хранилище ключей и значений — у каждой записи есть ключ. Почему бы вам просто не проверить, существует ли хеш-ключ в таблице (получить элемент по его хэш-ключу и предположить, что он не существует, если вы получите нуль)   -  person Smajl    schedule 07.12.2015
comment
@Smajl, как этого добиться? Можете ли вы помочь мне с некоторым кодом? Поскольку все, что я пытаюсь, не работает.   -  person User0706    schedule 07.12.2015
comment
Используйте маппер, чтобы получить элемент. Если товар возвращается, то он есть. См. docs.aws.amazon.com/mobile/sdkforandroid/developerguide/< /а>.   -  person Yangfan    schedule 08.12.2015
comment
@Yangfan Как вы можете видеть в приведенном выше коде, я использовал только картограф. Я не знаю, правильно я его использую или нет.   -  person User0706    schedule 09.12.2015
comment
Эй, у меня есть один вопрос, что произойдет, если у меня есть и хеш-ключ, и ключ ярости. Но я хочу проверить только хеш-ключ. Как я могу это сделать?   -  person Chirag Savsani    schedule 05.05.2016
comment
@ChiragSavsani Вы хотите выполнить сканирование только с использованием хеш-ключа?   -  person User0706    schedule 06.05.2016
comment
Да. Как я могу это сделать?   -  person Chirag Savsani    schedule 06.05.2016
comment
@ChiragSavsani results = table.scan(email__eq= 'new', limit=1); вы можете использовать его так, где адрес электронной почты будет вашим хэш-ключом, а новый будет элементом под хэш-ключом.   -  person User0706    schedule 06.05.2016


Ответы (1)


Как выглядит ваш класс картографа для элемента? Я предполагаю, что у вас есть электронная почта в виде хеш-ключа без ключа диапазона, потому что имя пользователя для входа должно быть уникальным. Вам нужен только хеш-ключ объекта, чтобы загрузить его с помощью метод загрузки. Это при условии, что нет ключа диапазона.

Попробуйте использовать это.

    AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(credentialsProvider);
    DynamoDBMapper mapper = new DynamoDBMapper(ddbClient);

    // Use the password as the third parameter if it is a range key.
    Item item = mapper.load(Item.class, email1);

    if(item == null){
        // That email is not in the database
    }
    else{
        // Does exist in database, now compare password.
    }
person JellyJay    schedule 10.12.2015
comment
Джей, у меня есть электронная почта в виде хеш-ключа и пароль в качестве ключа диапазона - person User0706; 10.12.2015
comment
Попробуйте тот же код, но используйте пароль в качестве третьего параметра в функции загрузки. - person JellyJay; 11.12.2015
comment
Какие ошибки вы получаете? Есть ли трассировка стека? - person JellyJay; 11.12.2015
comment
Я добавил стек strace @Jelly Jay - person User0706; 14.12.2015
comment
Я предполагаю, что электронная почта - это хэш-ключ. Он не может быть нулевым, когда вы загружаете его с помощью картографа. - person Yangfan; 15.12.2015
comment
Спасибо @JellyJay за ваш ответ. - person Chirag Savsani; 05.05.2016
comment
@JellyJay Привет, у меня есть один вопрос: что произойдет, если у меня есть и хеш-ключ, и ключ ярости. Но я хочу проверить только хеш-ключ. Как я могу это сделать? - person Chirag Savsani; 05.05.2016