首页 理论教育 使用SQLite和Bmob进行云存储

使用SQLite和Bmob进行云存储

时间:2023-06-30 理论教育 版权反馈
【摘要】:熟悉Android内置的SQLite数据库的使用,本实验需要从联系人模块查询出联系人数据,然后将该数据插入SQLite数据库中,掌握SQLite数据库的插入、查询等操作。掌握Bmob后端云数据存储、删除、更新和查询的方法。

使用SQLite和Bmob进行云存储

1.实验目的

(1)通过联系人模块了解Content Provider的运行机制,掌握通过Content Resolver获取联系人的信息。

(2)熟悉Android内置的SQLite数据库的使用,本实验需要从联系人模块查询出联系人数据,然后将该数据插入SQLite数据库中,掌握SQLite数据库的插入、查询等操作。

(3)掌握Bmob后端云数据存储、删除、更新和查询的方法。

(4)通过图标字体库Ico Moon的使用,美化应用程序界面。

2.ContentResolver

Content Provider是Android在不同的应用程序之间实现数据共享的一种机制,不管共享的数据通过什么方式存储(存储在SQLite数据库中、云服务器中或者通过文件存储在移动设备的内部存储器中),都可以通过ContentProvider共享数据,实现对数据的CRUD(Create,Read,Update and Delete,增加、读取、更新和删除)操作,使用者ContentResolver不需要了解ContentProvider的内部实现方式,通过URI(Universal Resource Identifier,统一资源标志符)即可对共享的数据进行操作。ContentProvider和Content Resolver的工作原理如图5.39所示。

图5.39 ContentProvider和Content Resolver的工作原理

Android系统中设有很多常用的URI,如下所述。

•联系人URI:ContactsContract.Contacts.CONTENT_URI。

•联系人电话URI:ContactsContract.Common Data Kinds.Phone.CONTENT_URI。

•联系人E-mail URI:ContactsContract.CommonDataKinds.Email.CONTENT_URI。

•SD卡上音频文件的URI:MediaStore.Audio.Media.EXTERNAL_CONTENT_URI。

•内部存储器上音频文件的URI:MediaStore.Audio.Media.INTERNAL_CONTENT_URI。

•SD卡上图片文件的URI:MediaStore.Audio.Images.EXTERNAL_CONTENT_URI。

•内部存储器上图片文件的URI:MediaStore.Audio.Images.INTERNAL_CONTENT_URI。

•SD卡上视频文件的URI:MediaStore.Audio.Video.EXTERNAL_CONTENT_URI。

•内部存储器上视频文件的URI:MediaStore.Audio.Video.INTERNAL_CONTENT_URI。

Android的组件都有一个ContentResolver对象,该对象的获取方法如下。

Content Resolver类提供了与ContentProvider类进行交互的4个增删改查的方法,如下所述。

•public Uri insert(Uri uri,Content Values values):向ContentProvider中添加数据。第一个入参是访问ContentProvider的URI,第二个入参Content Values为插入数据的字段-取值键值对对象。该方法的出参为访问该数据的URI。如果ContentProvider底层数据存储在数据库中,那么一般Content Values的键为数据库中表的字段名称,值为该字段的取值。Content Values只能存储基本数据类型,如String、int等,不能存储自定义对象。若通过ContentProvider增加一条记录,姓名(字段名为NAME)取值为“Albert Einstain”,年龄(字段名为AGE)为60,则定义Content Values如下。

•public int delete(Uri uri,String selection,String[]selection Args):从ContentProvider中删除数据。selection为SQL语句中的where查询子句,selection Args查询条件属性值,用于替换selection中的“?”通配符。例如,selection取值为“select name from table where id=?and name=?”,selection Args取值为{"1","Albert Einstain"},最终生成的SQL语句为“delete from table where id=1 and name="Albert Einstain";”。出参为删除的记录的个数。

•public int update(Uri uri,Content Values values,String whereClause,String[]where Args):更新ContentProvider中的数据。values为要更新的值,whereClause为可选的where子句,如果其值为null,则将修改所有的行,在whereClause中包含“?”时,如果where Args的值不为null,则这个数组中的值将依次替换whereClause中出现的“?”。

•public Cursor query(Uri uri,String[]projection,String selection,String[]selection Args,String sort Order):从ContentProvider中查询数据。参数projection是投影,即查询数据要返回的列,sort Order为结果排序方式,即查询结果根据指定字段进行排序。

3.SQLite数据库

SQLite是Android内置的一款轻量级数据库,每个应用程序均可调用该数据库。对数据库进行操作的方式包括:代码操作数据库和命令行操作数据库。

(1)代码操作数据库

在代码中对数据库进行CRUD操作的类是SQLiteDatabase,该类提供了整套对数据库进行操作的方案,是对SQLite数据库进行操作最重要的类。该类提供的常用方法和Content Resolver提供的方法很相似,相同入参不再赘述。

•Long insert(String table,String nullColumn Hack,Content Values values):插入一条记录。table是要插入数据的表;SQL不允许插入空行,nullColumn Hack初始化值为空时,这一列将会被显式地赋予一个null值;values是要插入的值。

•int update(String table,Content Values values,String whereClause,String[]whereArgs):更新一条记录。

•Cursor query(String table,String[]projection,String selection,String[]selection Args,String group By,String having,String order By):查询数据库。having为可选的having子句,如果其值为null,则将包含所有的分组。

•int delete(Uri uri,String selection,String[]selection Args):删除记录。

•static SQLiteDatabase openOrCreateDatabase(File file,Cursor Factory factory):打开或创建数据库。该方法是一个静态的方法,所以不需要获取SQLiteDatabase实例就可以对数据库进行操作。入参file是数据库文件所在目录及数据库文件名;入参factory为可选的数据库游标工厂类,当查询被提交时,该对象会被调用来实例化一个游标,默认为null。

•void close():关闭数据库。

•void execSQL(String sql):直接执行入参SQL语句。

查询数据库后,将结果返回给游标Cursor,这是查询结果的记录集,Cursor类常用的方法主要有以下几种。

•boolean move To Next():将Cursor移向下一行。

•int getCount():返回结果集中记录的数目。

•int getInt(int columnIndex):返回指定列中的数据的整型值。

•int getString(int columnIndex):返回指定列中的数据的字符串。

•int getColumnIndex(String column Name):按给定的列名返回列的索引值,若不存在则返回-1。

•boolean moveToFirst():将Cursor移动到第一行。

(2)命令行操作数据库

代码建库后数据库文件存放在/data/data/package-name/databases/目录下,数据库的所有信息都可以通过命令行终端查看。Android Studio具有内置的命令行终端,直接在主窗口的下方单击“Terminal”即可使用,如图5.40所示。

图5.40 命令行建库

首先,启动模拟器后在“Terminal”窗口中执行“adb shell”命令登录命令行终端。如果环境变量%ANDROID_HOME%\platform-tools配置不正确,会报错“adb shell不是内部或外部命令,也不是可运行的程序或批处理文件”,这时需要重新检查并修改环境变量。adb shell登录后默认只具备普通用户权限,所以需要切换到root用户:

其次,进入/data/data/package-name/databases/目录下,可以通过Linux系统下的“ls”命令等查看文件和路径,这里以cn.edu.android.app14目录为例:

再次,通过sqlite3工具打开数据库,如果该数据库不存在,则创建该数据库。例如,打开或创建contacts数据库,当显示SQLite数据库的版本号时表示完成打开或创建数据库。打开数据库后就可以执行数据的SQL语句或SQLite数据库的命令,SQLite内置命令都以“.”开头,例如,“.tables”命令可查看当前数据库中的所有表。

最后,通过“.exit”命令或者“.quit”命令退出SQLite,返回Linux命令行终端。

4.Bmob云存储

Bmob云存储具有高效的服务器数据存储和完善的移动后端云服务,提供了对数据进行CRUD操作的API,可以帮助开发者摆脱后端开发负担,可以缩短开发周期。Bmob提供了云数据库和文件服务,任何数据、文件都可以存放在云服务器上。使用Bmob云存储之前,需要做如下准备工作。

(1)登录官方网站https://www.bmob.cn/,初次使用的开发人员需要在该网站进行注册。网站同时提供了使用文档和视频供开发者学习

(2)注册完成后进入首页“我的控制台”,在新打开的页面中单击按钮创建应用,在应用名称和应用类型处输入任意内容,选择免费的开发版,单击“创建应用”,如图5.41所示。

图5.41 Bmob云存储中创建应用

(3)创建完成后返回控制台,控制台出现图5.42所示的界面,单击“应用Key”跳转到图5.43所示的界面,可获取应用密钥,单击图5.43中的“复制”按钮即可得到Application ID。单击“云数据库”,可查看当前创建的数据库,且可对库中的数据进行CRUD操作。

图5.42 Bmob云存储控制台(一)

图5.43 Bmob云存储控制台(二)

(4)使用Gradle对Bmob Android SDK包依赖进行管理。在项目的build.gradle文件中添加Bmob的maven仓库地址

在模块的build.gradle文件中添加依赖。

(5)使用Bmob存储数据的主要步骤还包括:初始化BmobSDK、创建对应Bmob后台表的JavaBean、配置ContentProvider、对数据进行增删改查。在后续的实验步骤中将分别介绍上述内容,读者也可查阅官网文档或视频进行学习。

5.图标字体库IcoMoon

在开发移动应用程序时,程序员经常困扰于没有合适的UI图标资源。该问题可通过图标字体库解决,利用网站提供的图标字体库,程序员不需要修图就可得到想要的矢量图,还可以通过代码设置矢量图的颜色、大小。图标字体库有很多种,使用方法总体相似,本实验中使用Ico Moon,网址为https://icomoon.io/app/#/select。下面介绍如何下载图标字体库。

首先,进入网站后单击左上角的菜单按钮,如图5.44(a)所示,在弹出的菜单中选择“New Project”,在随后出现的图5.44(b)所示的界面中输入项目名称

图5.44 在Ico Moon中登记项目

其次,在图5.45(a)所示的界面中单击“Add Icons From Library…”,进入图5.45(b)所示的界面,选中“Ico Moon-Free”,单击“Add”按钮增加需要的图标字体库。

图5.45 选择图标字体库

最后,在图5.46(a)所示的界面中选择“user”“mobile”和“envelop”,单击右下角的“Font”按钮,进入图5.46(b)所示的界面,单击“Download”进行下载,供代码调用。

图5.46 下载图标字体库(www.xing528.com)

6.界面与代码结构

图5.47(a)所示为本实验的唯一界面,本实验有以下两个功能。首先,如图5.47(b)所示,在该界面中输入姓名、电话号码和E-mail地址,然后点击“添加至通讯录”按钮,刚输入的联系人及其联系方式会被保存在设备联系人模块中,如图5.47(c)所示。然后,点击“备份通讯录”按钮,可将数据备份至Bmob云存储平台,如图5.48所示,同时会将数据备份至本地SQLite数据库中,单击Android Studio右下角的“Device File Explorer”按钮可以查看数据库已经创建,如图5.49所示。如果Bmob云存储平台和SQLite数据库中有数据,则在备份之前会将数据全部清空。通过两种功能的实现,学习联系人模块数据的读取、SQLite数据库和Bmob云存储平台的使用方法。

图5.47 App14实验界面和功能

图5.48 将联系人模块备份至Bmob云

图5.49 浏览模拟器上创建的数据库文件

图5.50所示为本实验的代码结构,其中:

•Main Activity.java处理界面事件,并在相关的按钮中通过Content Resolver访问联系人模块;

•Sqlite Adapter.java和Bmob Adapter.java分别对SQLite数据库和Bmob云存储平台进行相关操作;

•Contacts.java这个类为实现Bmob云存储功能而必须提供的JavaBean类,Bmob云上会相应地生成一张名为Contacts的表,该类必须继承自BmobObject,Contacts表中的字段必须在Contacts这个类中定义为成员变量,并且生成这些变量的setter()和getter()方法;

•MDFonts Utils.java和MDFonts.java这两个类分别是为生成图标字体而创建的字体映射类。

图5.50 App14代码结构

7.实验步骤

步骤1:新建模块App14,按照第4章实验2相关叙述部署Butter Knife依赖环境。

步骤2:首先导入图标字体库。右击模块,在弹出的菜单中依次选择“new”|“directory”,在弹出的对话框中输入“assets”,在assets目录下继续创建fonts目录。然后将本实验中下载的图标字体库压缩包解压,复制解压后fonts目录下的文件icomoon.ttf至assets/fonts目录下。

步骤3:创建一个图标字体映射类。在Android中使用枚举内存消耗较大,图标字体库官方不推荐用枚举方式,所以这里创建一个注解类定义字符串常量。打开下载的图标字体库压缩包里的demo.html文件,根据该文件内容对应地创建字体映射类MDFonts.java。

上述代码类似于定义了3个静态常量,如下所示,但上述代码具有更高的效率

步骤4:定义字体工具类设置控件的图标。

步骤5:在colors.xml文件中增加颜色。

步骤6:在drawable目录下新建两个形状文件shape_btn_white.xml和shape_btn_blue.xml,分别作为界面中白色按钮和蓝色按钮的背景。白色按钮带弧度,且有0.5 dp的浅灰色边框,代码如下所示。

蓝色按钮不带边框,代码如下所示。

步骤7:在drawable目录下增加文件shape_register_editext.xml,用于定义光标颜色,光标为深灰色,宽度为1 dp,代码如下所示。

步骤8:修改布局文件activity_main.xml。整体布局由嵌套的布局构成,以下代码实现了“输入姓名”输入栏。

“输入电话号码”的界面设置方式与上方代码类似,“输入电话号码”中Text View的ID为tv_phone,Edit Text的ID为et_phoneNo,“输入E-mail地址”中Text View的ID为tv_email,Edit Text的ID为et_email,请读者参考以上代码自行完成。

步骤9:在输入栏下面增加两个按钮“添加至通讯录”和“备份通讯录”,将两个按钮放入一个线性布局中,并使其在水平方向各占布局宽度的1/2。

步骤10:在Main Activity.java中通过Butter Knife获取各个控件并绑定,并生成两个按钮的点击事件,最后在on Destroy()方法中解除绑定,具体过程参考第4章实验2相关内容。各控件的变量取值情况如下所示。

步骤11:为控件设置图标颜色和大小。定义一个set View()方法,使用该方法为Text View设置需要的颜色和大小。

在onCreate()方法中对相关控件进行设置,设置完成后运行程序就能看到界面已经加载了图标的颜色和大小。

步骤12:为两个按钮增加点击事件的处理函数on View Clicked()方法,两个按钮的点击事件分别封装在onClick BtInsert()和onClick BtBak()方法中,具体代码在后面的步骤中增加。

步骤13:向通讯录模块增加联系人及其联系方式时,需要判断输入的内容是否为空,如果为空则通过Toast进行提示,该功能由check Input()方法实现,读者可以在该方法中增加更加严格的判断,如输入的邮箱地址是否正确等。当点击两个按钮时,需要隐藏系统软键盘,该功能通过hideSoftInput()方法实现。

步骤14:点击“添加至通讯录”按钮则调用Content Resolver向系统通讯录增加记录。

步骤15:创建Sqlite Adapter.java,实现打开数据库、关闭数据库的方法,创建表contactsinfo,并实现向表contactsinfo中插入数据、删除所有数据和查询数据的代码。

步骤16:下面实现Bmob云存储功能。首先按前面的介绍做好前期准备工作,然后创建对应Bmob后台表的JavaBean,这里将其命名为Contacts,最终在Bmob云上生成一个名为Contacts的表。Contacts这个类需继承自BmobObject,该类包含4个字段,请读者自行生成4个成员变量的setter()和getter()方法。为了方便传值,该类需定义一个带4个入参的构造方法。另外,为了方便调试,需要覆盖toString()方法。

步骤17:在Android Manifest.xml文件中配置ContentProvider。

步骤18:创建Bmob Adapter,在该类中初始化Bmob SDK,并提供方法对Bmob云数据进行插入、删除、查询操作。

步骤19:备份联系人信息至本地SQLite数据库和Bmob云。

步骤20:增加联系人模块和Bmob云存储所需的访问权限。

步骤21:运行和测试App14。在启动后需要在“Settings”|“Apps& Notifications”|“App14”|“Permissions”中打开相关权限。

知识拓展:删除模块

删除模块的步骤如下所述。

步骤1:打开“Gradle Scripts”下的settings.gradle文件,找到要删除的工程名,将其删除。

步骤2:单击“运行”按钮旁的下拉列表,选择“Edit Configurations…”选项,在弹出的窗口中选中工程名称,再单击按钮删除。

步骤3:打开项目所在的物理路径,在项目的路径下将该工程删除。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈