我目前正在尝试将一个项目添加到我设置的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体验很少,这就是为什么这会成为一个问题。
任何从这里出发的帮助都将不胜感激。
答案 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