连接到Amazon AWS DynamoDB NoSQL的Android应用程序

时间:2018-04-23 17:45:30

标签: android amazon-web-services amazon-dynamodb

我目前正在尝试将一个项目添加到我设置的NoSQL DynamoDB中,我一直在关注如何执行此操作的亚马逊文档,但它从未正常工作并且会回发错误。

我找到了使用文档在dynamoDB上执行CRUD操作的指南:https://aws.amazon.com/blogs/mobile/using-amazon-dynamodb-document-api-with-the-aws-mobile-sdk-for-android-part-2/(第2部分,第1部分讨论的是使用文档而不是连接)。

起初我在我的主要活动中尝试了它,但很快就知道在Android上禁止在主要网络上运行网络操作(完全有道理)。所以我把它放在一个扩展ASyncTask的类中。看起来像这样:

public class DBControl_v2 extends AsyncTask<String, Void, String> {

    CognitoCachingCredentialsProvider credentialsProvider;
    AmazonDynamoDBClient dbClient;
    Table dbTable;

    Context context;

    protected String doInBackground(String... items){

        System.out.println(items);

        // Create a new credentials provider
        credentialsProvider = new CognitoCachingCredentialsProvider(
                context, "us-east-2_---------", Regions.AP_NORTHEAST_2);

        // Create a connection to DynamoDB
        dbClient = new AmazonDynamoDBClient(credentialsProvider);

        // Create a table reference
        dbTable = Table.loadTable(dbClient, "ShoppingLists");

        Document memo = new Document();

        memo.put("Apple", "apple");

        dbTable.putItem(memo);

但问题是凭据提供者的“上下文”,构造函数需要这个,据我所知,它必须来自扩展活动的类,但老实说我不知道​​并且在指南中我跟着它只是说“背景”,这是非常无益的。

运行此命令时logcat的错误是:

java.lang.IllegalArgumentException: context can't be null

这很有道理,因为上下文为空,但如果我尝试初始化它,它会创建一个巨大的东西,我无法想象这是做到这一点。

我创建了另一个完全相同的类,除了它扩展了“Activity”,但是当我运行它时它会吐出这个错误:

Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference

这可能意味着您不能仅仅扩展活动并期望它能正常工作。

最初我使用本指南(直接来自亚马逊):https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-nosql-database.html

但是当它需要一个“IdentityManager”对象时却挂断了,因为它在教程之前没有说过它甚至是什么。当我在IdentityManager上查看白皮书时,构造函数也需要该死的上下文。上下文经常与Android一起使用,也许是因为我的Android体验很少,这就是为什么这会成为一个问题。

任何从这里出发的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您使用的是您引用的指南,那么首先应该确保您已在MainActivity的OnCreate()中添加了AWSMobile客户端。它是管理连接的单例对象实例。代码位于此链接https://docs.aws.amazon.com/aws-mobile/latest/developerguide/getting-started.html#add-aws-mobile-sdk-basic-setup,但我也在此处粘贴:

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;
public class MainActivity extends AppCompatActivity {

 // Declare a DynamoDBMapper object
 DynamoDBMapper dynamoDBMapper;

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

     // Instantiate a AmazonDynamoDBMapperClient
     AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.getInstance().getCredentialsProvider());
     this.dynamoDBMapper = DynamoDBMapper.builder()
            .dynamoDBClient(dynamoDBClient)
            .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
            .build();
     }
} `

然后您应该能够使用https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-nosql-database.html中注明的代码,如下所示:

Runnable runnable = new Runnable() {
 public void run() {
 dbClient = new AmazonDynamoDBClient(credentialsProvider);

    // Create a table reference
    dbTable = Table.loadTable(dbClient, "ShoppingLists");

    Document memo = new Document();

    memo.put("Apple", "apple");

    dbTable.putItem(memo);
  }
};
Thread mythread = new Thread(runnable);
mythread.start();

通过多种方式进行上述调用,您也可以根据此进行调整以使用当前代码。请记住,本指南假定您已使用AWS Mobile Hub创建了NoSQL数据库和入门项目,如果您还没有,请不要担心,只需确保您在此处遵循SDK设置信息:https://docs.aws.amazon.com/aws-mobile/latest/developerguide/how-to-android-sdk-setup.html