Applied Cognitive Computing Fall 2016 Android Application ... · Android Application + IBM Bluemix...
Transcript of Applied Cognitive Computing Fall 2016 Android Application ... · Android Application + IBM Bluemix...
AppliedCognitiveComputingFall2016
AndroidApplication+IBMBluemix(CloudantNoSQLDB)
Inthisexercise,wewillcreateasimpleAndroidapplicationthatusesIBMBluemix’CloudantNoSQLDB.TheapplicationwillcommunicatewithaCloudantNoSQLdatabaseandperformread/writeoperationsonit.
1. OpenAndroidStudio,clickonFile->New->NewProject(youarefreetouseanyapplicationnameandcompanydomain)
2. ClickonNext,andmakesureonly“PhoneanTablet”ischecked.MakesureminimumSDKissettoAPI19orgreater.
3. ClickonNext,andselectEmptyActivity.
4. ClickonNext,andthenclickonFinish
5. Openapp->java->res->layout->activity_main.xml.Then,clickonText
6. ModifytheXMLfile,sothatitlookslikethis:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="-------------------------DO NOT CHANGE ANYTHING HERE--------------------------"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Write" android:id="@+id/writeButton" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/idEditText" android:layout_below="@+id/writeButton" android:layout_alignParentEnd="true" android:layout_alignParentStart="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Read" android:id="@+id/readButton" android:layout_below="@+id/idEditText" android:layout_alignParentStart="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/responseEditText" android:layout_below="@+id/readButton" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" /> </RelativeLayout>
7. Openapp->java->---context----->MainActivity.java
8. AddthefollowingfieldstoyourMainActivityclassprivate String DB_NAME = ""; private String ACCOUNT = ""; private String USERNAME = ""; private String PASSWORD = "";
9. AddthefollowingmethodsandclassestoyourMainActivityclass:private void setUpWriteButton() { Button button = (Button) findViewById(R.id.writeButton); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { writeButtonPressed(); } }); } private void setUpReadButton() { Button button = (Button) findViewById(R.id.readButton); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { readButtonPressed(); } }); } private void writeButtonPressed() { new WriteAsyncTask().execute(); }
private void readButtonPressed() { EditText idEditText = (EditText) findViewById(R.id.idEditText); String id = idEditText.getText().toString(); new ReadAsyncTask().execute(id); } class WriteAsyncTask extends AsyncTask<Void, Void, User> { @Override protected User doInBackground(Void... arg0) { User user = null; try { // Create a new CloudantClient instance for account endpoint <ACCOUNT>.cloudant.com CloudantClient client = ClientBuilder.account(ACCOUNT) .username(USERNAME) .password(PASSWORD) .build(); // Get a Database instance to interact with. Do not create it if it doesn't already exist Database db = client.database(DB_NAME, false); user = new User("RandomFirstName", "RandomLastName", new Date(), 18); db.save(user); } catch (Exception e) { e.printStackTrace(); } return user; } @Override protected void onPostExecute(User user) { super.onPostExecute(user); EditText responseEditText = (EditText) findViewById(R.id.responseEditText); responseEditText.setText("User created:\nID:" + user.getId()); } } class ReadAsyncTask extends AsyncTask<String, Void, User> { @Override protected User doInBackground(String... arg0) { User user = null; try { String id = arg0[0]; // Create a new CloudantClient instance for account endpoint <ACCOUNT>.cloudant.com CloudantClient client = ClientBuilder.account(ACCOUNT) .username(USERNAME) .password(PASSWORD) .build(); // Get a Database instance to interact with. Do not create it if it doesn't already exist Database db = client.database(DB_NAME, false); // Get an ExampleDocument out of the database and deserialize the JSON into a Java type user = db.find(User.class, id);
} catch (Exception e){ e.printStackTrace(); } return user; } @Override protected void onPostExecute(User user) { super.onPostExecute(user); EditText responseEditText = (EditText) findViewById(R.id.responseEditText); if (user != null) { responseEditText.setText("Read user from DB:\n" + "ID: " + user.getId() + "\n" + "FirstName: " + user.getFirstName() + "\n" + "LastName: " + user.getLastName() + "\n" + "Creation Date: " + user.getCreationDate().toString() + "\n" + "Age: " + user.getAge() + "\n" ); } else { responseEditText.setText("User not found"); } } }
10. CallthemethodssetUpWriteButton()andsetUpReadButton()attheendoftheonCreatemethod:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setUpWriteButton(); setUpReadButton(); }
11. Createanewclass.NameitUser
// A Java class that can be serialized to JSON public class User { private String _id; private String firstName; private String lastName; private Date creationDate; private int age; public User() { new User("firstNameTest", "lastNameTest", new Date(), -1); } public User(String firstName, String lastName, Date creationDate, int age) { this._id = UUID.randomUUID().toString(); this.firstName = firstName; this.lastName = lastName; this.creationDate = creationDate; this.age = age;
} public String getId() { return _id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Date getCreationDate() { return creationDate; } public void setCreationDate(Date creationDate) { this.creationDate = creationDate; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
12. OpenGradleScripts->build.gradle(Module:app).Addthefollowinglinesinthedependenciessection:
compile group: 'com.squareup.okhttp', name: 'okhttp-urlconnection', version: '2.7.5' compile group: 'com.cloudant', name: 'cloudant-client', version: '2.6.0' compile 'com.google.code.gson:gson:2.2.4'
13. Wearereadytosetupourdatabase.Gotothispage:https://new-
console.ng.bluemix.net/andlogin
14. ClickonCatalog
15. SelectData&Analytics,andthenclickon“CloudantNoSQLDB”
16. ScrolltothebottomofthepageandclickonCreate
17. ClickonLaunch
18. ClickonDatabasesandthenclickonCreateDatabase
19. GiveanametoyourdatabaseandclickonCreate.20. OncethenewDBiscreated,clickonPermissions
21. LocateandpresstheGenerateAPIKeybutton.WewillusetheAPIkeytocommunicatewiththedatabaseprogrammatically.
22. OncetheAPIkeyiscreated,you’llseesomethinglikethis:
23. Leavethatpageopened.Wewillbecopyingthekeyanditspasswordtoourcode.
24. Givereadandwritepermissionstothekeyyoujustcreated
25. GobacktoyourAndroidprojectandlocatethefollowingvariables: private String DB_NAME = ""; private String ACCOUNT = ""; private String USERNAME = ""; private String PASSWORD = "";
26. Thevariablemustbeinitializedwiththefollowingvalues:
private String DB_NAME = "<Name you gave to the DB in step 18>"; private String ACCOUNT = "<See below>"; private String USERNAME = "<The Key you generated in step 21>"; private String PASSWORD = "<The password the key was given when generated>";
27. ThevalueyoushouldassigntothevariableACCOUNTcanbefoundintheURLofthepagewhereyoumanageyourdatabase.TheURLhasthefollowingformat.
https://<YouraccountID>.cloudant.com/dashboard.html Copythe<YouraccountID>sectionoftheURL,andusethattoinitializeACCOUNT
28. AddthefollowingtoyourAndroidManifest.xmlfile:<uses-permission android:name="android.permission.INTERNET" />
29. Testyourapp