您可能已知道 Bluemix 的一些优势,这是 IBM 用于开发和部署移动和 Web 应用程序的开放平台。Bluemix 中的移动解决方案中许多预先构建的服务使得开发人员能够轻松地构建和增强应用程序。
本系列教程 将介绍如何向您的应用程序添加基于云的服务。在本教程中,我们将介绍使用 IBM Mobile Data for Bluemix 服务 构建一个 Android 应用程序的步骤。
正在 MobileFirst Platform 中寻找新的 iOS 8 beta 服务 ?以下是一些 入门操作 。另请查阅我们 更新的 BlueList 示例代码 。
观看: 网络广播:使用 MobileData Cloud 构建 Android 应用程序
您是否曾经前往杂货店,然后却忘记了您的配偶制作美味甜点所需的原料是什么?或者忘记了孩子们请求第二天吃的饭后甜点是什么?如果将他们的请求输入一个共享的杂货列表中,您可以收到提醒您进行更新的推送通知,那该有多好?
输入 BlueList 应用程序。它是一个使用 Bluemix 服务的简单应用程序,使您能够立即开始编写自己的(更复杂的)应用程序!本教程将展示如何从一个 Android 应用程序入手,添加 IBM Mobile Data for Bluemix 服务来存储、删除、更新和查询存储在云中的对象。(未来的一篇教程将展示如何向应用程序添加 Push 和 Node.js Cloud 服务,以便在货物列表更新时获得通知,因此,当某个设备以某种方式更新列表时,所有设备上的列表都会得到更新。)
“ 这个简单的应用程序使用了 Bluemix 服务,将引导您立即开始编写自己的(更复杂的)应用程序。 ”
bluelist-base(v0) 代码是 BlueList 应用程序的基础版本。我们将展示如何添加 IBM Mobile Data for Bluemix 服务,以便您的代码看起来将像 bluelist-mobiledata(v1) 代码。您可从 bluelist-base(v0) 开始逐步执行,或者直接下载 bluelist-mobiledata(v1)。BlueList 应用程序的 bluelist-mobiledata(v1) 版本包含 IBM Mobile Data for Bluemix 服务。
备注:如果您决定使用 Android Studio,那么可以跳过步骤 1.7-1.9,因为 Android 根目录中提供的 gradle.build
文件将引入需要的依赖项。请浏览以下这几个步骤,以便熟悉 Gradle 构建代码,取消注释需要的依赖项。您还需要 下载 Gradle.zip ,并将内容解压到您选择的目录中。当 Android Studio 提示输入 GRADLE_HOME 时,请使用 .zip 的解压路径,也就是 bin 目录所在的路径。
阅读: 开始使用 Mobile Data
点击查看大图
关闭 [x]
备注:在以后的操作中,需要使用这个 Application ID。
点击查看大图
关闭 [x]
applicationID=<INSERT_APPLICATION_ID_HERE> applicationSecret=<INSERT_APPLICATION_SECRET_HERE> applicationRoute=<INSERT_APPLICATION_ROUTE_HERE>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
第 3 步. 编辑 BlueListApplication 来初始化 SDK 和服务,以及向 IBM Mobile Data for Bluemix 服务注册 Item 规范。
public final class BlueListApplication extends Application { private static final String APP_ID = "applicationID"; private static final String APP_SECRET = "applicationSecret"; private static final String APP_ROUTE = "applicationRoute"; private static final String PROPS_FILE = "bluelist.properties";
onCreate
方法中执行以下编辑: public void onCreate() { super.onCreate(); itemList = new ArrayList<Item>(); // Read from properties file Properties props = new java.util.Properties(); Context context = getApplicationContext(); try { AssetManager assetManager = context.getAssets(); props.load(assetManager.open(PROPS_FILE)); Log.i(CLASS_NAME, "Found configuration file: " + PROPS_FILE); } catch (FileNotFoundException e) { Log.e(CLASS_NAME, "The bluelist.properties file was not found.", e); } catch (IOException e) { Log.e(CLASS_NAME, "The bluelist.properties file could not be read properly.", e); } }
onCreate
方法中,在读取 properties 文件的代码之后执行以下编辑: // initialize the IBM core backend-as-a-service IBMBluemix.initialize(this, props.getProperty(APP_ID), props.getProperty(APP_SECRET), props.getProperty(APP_ROUTE)); // initialize the IBM Data Service IBMData.initializeService(); // register the Item Specialization Item.registerSpecialization(Item.class);
IBMDataObject
,并将此类标注为 IBMDataObjectSpecialization
,集成 IBM Mobile Data for Bluemix 服务。一定要添加 NAME
字符串,以后会将它用作一个用来访问对象的键。 @IBMDataObjectSpecialization("Item") public class Item extends IBMDataObject { public static final String CLASS_NAME = "Item"; private static final String NAME = "name";
getName()
和 setName()
方法,以便使用 Mobile Data 服务的 getObject
和 setObject
方法。与对象关联的值通过键来引用。您可使用 setObject(<key>, <value>)
设置值,使用 getObject(<key>)
来检索它们。 public String getName() { return (String) getObject(NAME); } public void setName(String itemName) { setObject(NAME, (itemName != null) ? itemName : ""); }
第 5 步. 在 MainActivity 类中,使用 IBM Mobile Data for Bluemix 服务在云中创建、读取和删除数据
listItems
方法来从 IBM Mobile Data for Bluemix 服务读取数据项。我们将按不区分大小写的字母顺序来排序这些项。创建 listItems
作为 MainActivity
类的方法。 点击查看代码清单
关闭 [x]
public void listItems() { try { IBMQuery<Item> query = IBMQuery.queryForClass(Item.class); // Query all the Item objects from the server query.find().continueWith(new Continuation<List<Item>, Void>() { @Override public Void then(Task<List<Item>> task) throws Exception { final List<Item> objects = task.getResult(); // Log if the find was cancelled. if (task.isCancelled()){ Log.e(CLASS_NAME, "Exception : Task " + task.toString() + " was cancelled."); } // Log error message, if the find task fails. else if (task.isFaulted()) { Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage()); } // If the result succeeds, load the list. else { // Clear local itemList. // We'll be reordering and repopulating from DataService. itemList.clear(); for(IBMDataObject item:objects) { itemList.add((Item) item); } sortItems(itemList); lvArrayAdapter.notifyDataSetChanged(); } return null; } },Task.UI_THREAD_EXECUTOR); } catch (IBMDataException error) { Log.e(CLASS_NAME, "Exception : " + error.getMessage()); } }
onCreate
方法中设置 ArrayAdapter
后,调用 listItems()
在列表中填充已使用 IBM Mobile Data for Bluemix 服务存储的项。 itemsLV.setAdapter(lvArrayAdapter); /* Refresh the list. */ listItems();
createItem
方法,以便使用一个 IBMDataObject
类实例创建新项。在该实例上调用 Mobile Data 的 save()
方法,并使用 continueWith()
方法来处理错误或加载更新的列表。 点击查看代码清单
关闭 [x]
public void createItem(View v) { EditText itemToAdd = (EditText) findViewById(R.id.itemToAdd); String toAdd = itemToAdd.getText().toString(); Item item = new Item(); if (!toAdd.equals("")) { item.setName(toAdd); // Use the IBMDataObject to create and persist the Item object. item.save().continueWith(new Continuation<IBMDataObject, Void>() { @Override public Void then(Task<IBMDataObject> task) throws Exception { // Log if the save was cancelled. if (task.isCancelled()){ Log.e(CLASS_NAME, "Exception : Task " + task.toString() + " was cancelled."); } // Log error message, if the save task fails. else if (task.isFaulted()) { Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage()); } // If the result succeeds, load the list. else { listItems(); } return null; } }); // Set text field back to empty after item is added. itemToAdd.setText(""); } }
deleteItem
方法执行一些更改。它现在将在 IBMDataObject
类的一个实例上调用 Mobile Data 的 delete()
方法。 delete()
方法返回一个 Bolts Task
,用于检查任务是成功还是失败了。 点击查看代码清单
关闭 [x]
public void deleteItem(Item item) { itemList.remove(listItemPosition); // This will attempt to delete the item on the server. item.delete().continueWith(new Continuation<IBMDataObject, Void>() { @Override public Void then(Task<IBMDataObject> task) throws Exception { // Log if the delete was cancelled. if (task.isCancelled()){ Log.e(CLASS_NAME, "Exception : Task " + task.toString() + " was cancelled."); } // Log error message, if the delete task fails. else if (task.isFaulted()) { Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage()); } // If the result succeeds, reload the list. else { lvArrayAdapter.notifyDataSetChanged(); } return null; } },Task.UI_THREAD_EXECUTOR); lvArrayAdapter.notifyDataSetChanged(); }
第 6 步. 在 EditActivity 类中,使用 IBM Mobile Data for Bluemix 服务更新云上的数据
finishedEdit
方法将在要更新的 IBMDataObject
的实例上调用 Mobile Data 的 save()
方法。实现 continueWith()
方法来处理所有错误。 public void finishedEdit(View v) { Item item = itemList.get(location); EditText itemToEdit = (EditText) findViewById(R.id.itemToEdit); String text = itemToEdit.getText().toString(); item.setName(text); item.save().continueWith(new Continuation<IBMDataObject, Void>() { @Override public Void then(Task<IBMDataObject> task) throws Exception { if(task.isCancelled()) { Log.e(CLASS_NAME, "Exception : " + task.toString() + " was cancelled."); } else if (task.isFaulted()) { Log.e(CLASS_NAME, "Exception : " + task.getError().getMessage()); } else { Intent returnIntent = new Intent(); setResult(BlueListApplication.EDIT_ACTIVITY_RC, returnIntent); finish(); } return null; } },Task.UI_THREAD_EXECUTOR); }
点击查看大图
关闭 [x]
使用 Bluemix 中的 MobileData 服务 开发这个应用程序,应该能让您了解通过移动云服务来使用和集成移动数据功能有多容易!
BLUEMIX SERVICE USED IN THIS TUTORIAL: Mobile Data 服务 提供容易使用的 SDK,这些 SDK 支持通过熟悉的面向对象的 API 访问一个可扩展、完全托管的数据库。