1、计算机科学与技术系实 验 报 告专业名称 计算机科学与技术 课程名称 Android 应用程序开发 项目名称 数据存储与访问 班 级计科 1 班 学 号 姓 名 同组人员 无 实验日期 2016.9.27 2一、实验目的与要求:1.1 实验目的掌握 SQLite 存储数据的方法,掌握 ContentProvider 的用法。1.2 实验要求(1) 练习使用 SQLite 数据库的方式进行数据存储和访问。(2) 练习使用 ContentProvider 访问其他应用程序的数据。(3) 完成实验报告。二、实验内容2.1 实验原理(1) 数据存储方式 SharedPreferences、File 存
2、储、SQLite 数据库(2) ContentProvider 数据共享在创建 ContentProvider 前,首先要实现底层的数据源,数据源包括数据库、文件系统或网络等,然后继承 ContentProvider 类中实现基本数据操作的接口函数,包括添加、删除、查找和更新等功能,调用者不能直接调用ContentProvider 的接口函数,而需要使用 ContentResolver 对象,通过 URI 间接调用 ContentProvider,调用关系如图:C o n t e n t R e s o l v e r C o n t e n t P r o v i d e r文件系统 数据库
3、 网络U R I2.2 实验过程及截图(1) 新建 Android 应用程序项目 SQLiteTest,创建 SQLite 数据库和表,并实现数据库数据读取和存入操作。31) 新建 SQLiteTest 项目2) 代码逻辑:MainActivity.java 文件 package edu.hfuu.sqlitetest;import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import an
4、droid.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity SQLiteDatabase sld,sdtest; Button bt_open,bt_close,bt_add,bt_delete,bt_update,bt_query; EditText et_log,et_query; Override protected void onCreate(Bundle
5、 savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 4bt_open=(Button)findViewById(R.id.Button01); bt_close=(Button)findViewById(R.id.Button02); bt_add=(Button)findViewById(R.id.Button03); bt_delete=(Button)findViewById(R.id.Button04); bt_update=(Button)fi
6、ndViewById(R.id.Button05); bt_query=(Button)findViewById(R.id.Button06); et_log=(EditText)this.findViewById(R.id.EditText01); et_query=(EditText)this.findViewById(R.id.EditText02); /创建、打开数据库 public void createDatabase(View v) try sdtest=openOrCreateDatabase(“dbtest.db3“, MODE_PRIVATE, null); sld=SQL
7、iteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+“/mydb.db3“, null); appendMessage(et_log,“数据库已经成功打开!“ ); String sql=“create table if not exists student(sid integer primary key autoincrement,sno char(5),“+“stuname varchar(20),“+“sage integer)“; sld.execSQL(sql); appendMessage(et_log,“s
8、tudent已经成功创建!“); catch(Exception e) Toast.makeText(this, “数据库错误:“+e.toString(), 5Toast.LENGTH_SHORT).show(); /关闭数据库 public void closeDatabase(View v) try sld.close(); sdtest.close(); appendMessage(et_log,“数据库已经成功关闭!“ ); catch(Exception e) Toast.makeText(this, “数据库错误:“ +e.toString(), Toast.LENGTH_SHO
9、RT).show(); /插入记录的方法 public void insert(View v) try String sql=“insert into student values(null,10001,Jarry,23)“; sld.execSQL(sql); appendMessage(et_log,“成功插入一条记录!“ ); catch(Exception e) Toast.makeText(this, “数据库错误:“+e.toString(), Toast.LENGTH_SHORT).show(); 6/删除记录的方法 public void delete(View v) try
10、String sql=“delete from student;“; sld.execSQL(sql); appendMessage(et_log,“成功删除所有记录!“ ); catch(Exception e) Toast.makeText(this, “数据库错误:“ +e.toString(), Toast.LENGTH_SHORT).show(); /修改记录的方法 public void update(View v) try String sql=“update student set stuname=Tom“; sld.execSQL(sql); appendMessage(et
11、_log,“成功更新记录!“ ); catch(Exception e) Toast.makeText(this, “数据库错误:“ +e.toString(), Toast.LENGTH_SHORT).show(); /查询的方法 7public void query(View v) try String sql=“select * from student where sage?“; Cursor cur=sld.rawQuery(sql, new String“20“); addMessage(et_query,“序号tt学号tt姓名tt年龄“ ); while(cur.moveToNe
12、xt() int sid=cur.getInt(0); String sno=cur.getString(1); String sname=cur.getString(2); int sage=cur.getInt(3); appendMessage(et_query,sid+“tt“+sno+“tt“+sname+“tt“+sage); cur.close(); catch(Exception e) Toast.makeText(this, “数据库错误:“ +e.toString(), Toast.LENGTH_SHORT).show(); /向文本区中添加文本 public void a
13、ppendMessage(EditText et,String msg) et.append(msg+“n“); 8public void addMessage(EditText et,String msg) et.setText(msg+“n“); 3) 布局文件:activity_main.xml 文件104) 实验结果运行项目后打开数据库,插入记录并查询11修改记录12删除记录并关闭数据库13(2) 实现通过 ContentResolver 读取应用程序 SQLiteTest 中数据的功能 1) 在 SQLiteTest 程序中添加 ContentProvider,提供数据访问接口 a.
14、 新建 Java 文件 MyContentProvider.java,继承自 ContentProvider 类,代码如下:package edu.hfuu.sqlitetest;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import .Uri;public clas
15、s MyContentProvider extends ContentProviderprivate static final UriMatcher um;staticum=new UriMatcher(UriMatcher.NO_MATCH);um.addURI(“edu.hfuu.provider.student“, “stu“, 1);SQLiteDatabase sld;Overridepublic String getType(Uri uri)return null;Overridepublic Cursor query(Uri uri, String projection, Str
16、ing selection,String selectionArgs, String sortOrder)switch(um.match(uri)case 1:Cursor cur=sld.query(14“student“,projection,selection,selectionArgs,null,null,sortOrder);return cur;return null;Overridepublic int delete(Uri arg0, String arg1, String arg2)/ TODO Auto-generated method stubreturn 0;Overr
17、idepublic Uri insert(Uri uri, ContentValues values)/ TODO Auto-generated method stubreturn null;Overridepublic boolean onCreate()sld=SQLiteDatabase.openOrCreateDatabase(getContext().getFilesDir().getPath()+“/mydb.db3“, /数据库所在路径null /CursorFactory);return false;15Overridepublic int update(Uri uri, Co
18、ntentValues values, String selection,String selectionArgs)/ TODO Auto-generated method stubreturn 0;b. 在 AndroidManifest.xml 中注册该 ContentProvider162) 新建 ContentResolverTest 项目,通过 ContentResolver 接口读取 SQLiteTest 程序数据库中的数据 a. MainActivity.java 代码如下:package edu.hfuu.contentresolvertest;import android.a
19、pp.Activity;import android.content.ContentResolver;import android.database.Cursor;import .Uri;import android.os.Bundle;import android.view.View;17import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class MainActivity extends ActivityContentReso
20、lver cr;Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);cr=this.getContentResolver();/初始化查询按钮Button b=(Button)this.findViewById(R.id.Button01);b.setOnClickListener(new OnClickListener()Overridepublic void onClick(View v
21、)EditText et=(EditText)findViewById(R.id.EditText01);String stuname=et.getText().toString().trim();Cursor cur=cr.query(Uri.parse(“content:/edu.hfuu.provider.student/stu“),new String“sid“,“sno“,“stuname“,“sage“,“stuname=?“,new Stringstuname,“sage ASC“);18appendMessage(“序号tt 学号 tt姓名tt年龄“);while(cur.mo
22、veToNext()int sid=cur.getInt(0);String sno=cur.getString(1);String sname=cur.getString(2);int sage=cur.getInt(3);appendMessage(sid+“tt“+sno+“tt“+sname+“tt“+sage);cur.close(););/向文本区中添加文本public void appendMessage(String msg)EditText et=(EditText)this.findViewById(R.id.EditText02);et.append(msg+“n“);b
23、. 界面布局文件 activity_main.xml 代码:3) 实验结果在模拟器上重新运行 SQLiteTest 项目,然后运行 ContentResolverTest 项目,分别在输入框中输入“Jarry” 和“Tom”,点击查询。 20三、实验分析与小结:1、SQLiteTest 中点击 Button 事件处理采用的方法是什么?并找出对应业务逻辑代码。答:方法:绑定到标签2、界面布局文件采用的布局方式是什么?答:线性布局3、数据存储的三种方式是什么?答:简单存储(SharedPrefences) 、文件存储、数据库存储4、访问者通过什么接口,访问其他应用程序通过 ContentProvider 提供的共享数据?答:ContentResolver四、其它得分(百分制)