【问题标题】:Android Amazon DynamoDb error in basic action基本操作中的 Android Amazon DynamoDb 错误
【发布时间】:2015-07-23 14:02:19
【问题描述】:

我正在尝试构建一个可以与 Amazon DynamoDB 交互的简单 Android 应用程序。我已经下载了最新的 Android Studio 和 AWS 移动 SDK。我现在要做的只是在我的表“客户”中插入一行。但是,当我运行该应用程序时,我遇到以下错误。如果你们能帮我看看,如果我犯了一些愚蠢的错误,我将不胜感激。(我已按照文档设置识别池,创建新策略,将内容放入 AsyncTask..etc)

谢谢,

错误

07-21 23:31:59.781    4207-4234/com.example.an.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.example.an.myapplication, PID: 4207
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
 Caused by: com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: No interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey annotation found in class class com.example.an.myapplication.customers
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.needAutoGenerateAssignableKey(DynamoDBMapper.java:720)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:780)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:688)
        at com.example.an.myapplication.MainActivity$db.doInBackground(MainActivity.java:67)
        at com.example.an.myapplication.MainActivity$db.doInBackground(MainActivity.java:56)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

MainActivity.java

package com.example.an.myapplication;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.*;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.*;



public class MainActivity extends ActionBarActivity {
private CognitoCachingCredentialsProvider credentialsProvider;
private static final String TAG = MainActivity.class.getSimpleName();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    credentialsProvider = new CognitoCachingCredentialsProvider(
            this.getApplicationContext(),    /* get the context for the current activity */
            "us-east-1:ef8bfc69-88b7-4714-ae0a-223f08a20fe5", // Identity Pool ID
            Regions.US_EAST_1 // Region
    );
    new db().execute("");
}

@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);
        customers customer = new customers();
        customer.setCustomerID("GG");
        customer.setBalance(5);
        mapper.save(customer);
        return "Executed";
    }

    @Override
    protected void onPostExecute(String result) {}

    @Override
    protected void onPreExecute() {}

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

customer.java

package com.example.an.myapplication;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.*;


@DynamoDBTable(tableName = "customer")
public class customers {
private String id;
private int balance;

@DynamoDBIndexHashKey(attributeName = "CustomerID")
public String getCustomerID() {
    return id;
}

public void setCustomerID(String id) {
    this.id = id;
}

@DynamoDBAttribute(attributeName = "Balance")
public int getBalance() {
    return balance;
}

public void setBalance(int balance) {
    this.balance = balance;
}
}

【问题讨论】:

    标签: android amazon-dynamodb


    【解决方案1】:

    我终于在亚马逊支持的帮助下解决了这个问题

    In customers.java, you don't have an attribute annotated with DynamoDBHashKey.
    Not sure how your DynamoDB table is set up. At minimum, it needs a hash key.
    If CustomerID is the hash key, then you need to change of the annotation of id
    from DynamoDBIndexHashKey to DynamoDBHashKey.
    

    结果我使用@DynamoDBIndexHashKey 而不是@DynamoDBHashKey!改正后就可以了!

    【讨论】:

      【解决方案2】:

      我今天遇到了这个问题,我通过在 proguard-rules.pro 中添加 -keep public class your_class 解决了这个问题。

      我不认为这是解决问题的正确方法,但它对我有用。

      http://developer.android.com/tools/help/proguard.html#configuring

      【讨论】:

      • 你的意思是在proguard-rules.pro中加入“-keep public class ”吗?我试过了,它对我不起作用。还是给我同样的错误信息
      • 在 proguard-rules.pro 中添加“-keep public class customers”后。我有同样的错误,这一行略有不同。 Caused by: com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: No interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey annotation found in class class com.example.an.myapplication.customers
      • Opps 抱歉,刚刚意识到这是同一个错误。所以显然在 proguard-rules.pro 中添加东西并没有真正改变任何东西..
      • 安林。对不起。我昨天试过了,它起作用了。我不知道昨天到底发生了什么,但今天它又不起作用了。你是对的..
      • Nynuzoud 仍然感谢您的回复!我在 Amazon link 提供的示例项目上尝试了很多次,但他们的项目都已经过时了,我什至无法在最新的 android studio 上运行它。这有点令人沮丧,我很确定我遵循了他们的所有步骤。 (我试过 Cognito Sync 并且它确实有效,所以这一定是一个 dynamoDB 问题......)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多