安卓数据库实验报告(共6篇)
篇1:安卓数据库实验报告
安卓实验报告
班级:学号:姓名:
xxxxx
11111111
xxxx
实验一:Activity生命周期的测试
一:实验目的
掌握使用Eclipse开发Android应用开发程序的方法; 掌握Android虚拟设备的创建方法; 了解Android的程序结构;
了解使用命令行创建Android程序方法;
了解Activity生命周期,理解Activity事件回调,onRestoreInstanceState()和 onSaveInstanceState两个函数的使用。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
(1)正常启动ActivityLife,然后单击用户界面的“结束程序”按钮关闭程序。
(2)正常启动ACtivityLife,然后通过“拨号键”启动内置的拨号程序,再通过“回 退建” 退出拨号程序,使ActivityLife重新显示在屏幕中。
四:实验核心代码
package com.example.activitylife;
import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.os.Build;
public class MainActivity extends Activity { private static String TAG=“LIFECYCLE”;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);Log.i(TAG,“(1)onCreate()”);Button button =(Button)findViewById(R.id.btn_finish);button.setOnClickListener(new OnClickListener(){
public void onClick(View view){
// TODO Auto-generated method stub
finish();
} });}
@Override
protected void onStart(){ // TODO Auto-generated method stub
super.onStart();Log.i(TAG,“(2)onStart()”);} @Override
protected void onRestoreInstanceState(Bundle savedInstanceState){ // TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);Log.i(TAG,“(3)onRestoreInstanceState()”);} @Override
protected void onResume(){ // TODO Auto-generated method stub
super.onResume();Log.i(TAG,“(4)onResume()”);} @Override
protected void onSaveInstanceState(Bundle outState){ // TODO Auto-generated method stub
super.onSaveInstanceState(outState);Log.i(TAG,“(5)onSaveInstanceState()”);} @Override
protected void onRestart(){ // TODO Auto-generated method stub
super.onRestart();Log.i(TAG,“(6)onRestart()”);} @Override
protected void onPause(){ // TODO Auto-generated method stub
super.onPause();Log.i(TAG,“(7)onPause()”);} @Override
protected void onStop(){ // TODO Auto-generated method stub
super.onStop();Log.i(TAG,“(8)onStop()”);} @Override
protected void onDestroy(){ // TODO Auto-generated method stub
super.onDestroy();Log.i(TAG,“(9)onDestroy()”);} } 五:运行结果截图:
实验二:用户界面——自我介绍
一:实验目的:
了解各种界面控件的使用方法;
掌握按键事件和触摸事件的处理方法;
掌握radioButton和radioGroup的使用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
要求写一个自我介绍的安卓应用,包括姓名,性别,爱好,其中性别用radioButton选项编写,点击提交时,姓名,性别,爱好会在下面显示出来。
四:实验核心代码:
public class MainActivity extends Activity { private EditText editText1;private EditText editText2;private EditText editText3;private TextView textView1;private TextView textView2;private TextView textView3;private RadioGroup radioGroup;private RadioButton radioButton1;private RadioButton radioButton2;private Button button;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText1 =(EditText)findViewById(R.id.e1);
editText2 =(EditText)findViewById(R.id.e2);
textView1 =(TextView)findViewById(R.id.t1);
textView2 =(TextView)findViewById(R.id.t2);
textView3 =(TextView)findViewById(R.id.t3);
radioGroup =(RadioGroup)findViewById(R.id.RadioGroup1);
radioButton1 =(RadioButton)findViewById(R.id.RadioButton1);
radioButton2 =(RadioButton)findViewById(R.id.RadioButton2);
button =(Button)findViewById(R.id.button1);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(RadioGroup arg0, final int arg1){
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
String str = editText1.getText().toString().trim();
String str1 = editText2.getText().toString().trim();
textView1.setText(“姓名:”+str);
textView3.setText(“爱好:”+str1);
if(arg1 == R.id.RadioButton1)
textView2.setText(“性别:”+“男”);
else if(arg1 == R.id.RadioButton2)
textView2.setText(“性别:”+“女”);
}
});
}
});} } 五:运行结果截图:
实验三:不同界面的切换
一:实验目的
掌握各种界面布局的特点和使用方法;
掌握选项菜单,子菜单和快捷菜单的使用方法。
二;实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三;实验内容:
设计一个Tab标签页,实现LinearLayout,RelativeLayout,AbsoluteLayout三种分页面之间的切换,每个页面的内容包括用户名和确定,取消两个按钮
四:实验核心代码: AndroidMainfest.xml:
public class MainActivity extends TabActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TabHost tabHost=getTabHost();LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab2,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab3,tabHost.getTabContentView(),true);tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“线性布局”).setContent(R.id.layout01));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“绝对布局”).setContent(R.id.layout02));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“相对布局”).setContent(R.id.layout03));} } Tab1,java public class Tab1 extends Activity { public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);} }
Tab2.java public class Tab2 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab2);} }
Tab3.java public class Tab3 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab3);} }
五:运行结果截图:
实验四:登陆界面和广播消息
一:实验目的
了解使用Intent进行组件通信的原理; 了解Intent过滤器的原理与匹配机制;
掌握发送和接受广播消息的方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
先写一个登陆界面,包括用户名,密码,点击登陆时实现页面的跳转功能,在第二个页面使用Intent发送消息,并调用sendBroadcast()函数把Intent携带的消息传送出去,用BroadcastReceiver接受广播消息,在页面下方显示广播内容。
四;实验核心代码:
public class MainActivity extends Activity { private Button button;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
Intent intent=new Intent(MainActivity.this,Second.class);
startActivity(intent);
} });} } public class Second extends Activity { private Button button2;private EditText editText;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Intent intent=getIntent();
editText=(EditText)findViewById(R.id.e1);
button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){
Intent intent=new
Intent(“com.example.broadcasttest.MY_BROADCAST”);
intent.putExtra(“message”, editText.getText().toString());
sendBroadcast(intent);
}
});
}
public class MyBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent){
String msg=intent.getStringExtra(“message”);
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();} }
android:name=“.Second”>
五:运行结果截图
实验五:Service绑定实现数据运算
一:实验目的
了解Service的原理和用途;
掌握本地服务的管理和方法; 掌握服务的隐式启动和显示启动方法;
掌握远程服务的绑定和调用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
以绑定方式使用Service,获取Service实例,当点击绑定服务时可以实现两个数的求差和比较大小功能,并输出结果,当点击取消绑定服务时,则无法运算。
四:实验核心代码
public class MathService extends Service{ private final IBinder mBinder=new LocalBinder();public class LocalBinder extends Binder{ MathService getService(){
return MathService.this;} } public IBinder onBind(Intent intent){ Toast.makeText(this, “本地绑定:MathService”,Toast.LENGTH_SHORT).show();return mBinder;}
public boolean onUnbind(Intent intent){ Toast.makeText(this, “取消本地绑定:MathService”, Toast.LENGTH_SHORT).show();return false;}
public long sub(long a,long b){ return a-b;}
public int compare(long a,long b){ if(a>b)return 1;else if(a==b)return 0;else return-1;
} }
public class MainActivity extends Activity { private MathService mathService;private Button button1;private Button button2;private Button button3;private Button button4;private EditText editText1;private EditText editText2;private EditText editText3;private boolean isBound=false;@Override
protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText1=(EditText)findViewById(R.id.e1);editText2=(EditText)findViewById(R.id.e2);editText3=(EditText)findViewById(R.id.e3);button1=(Button)findViewById(R.id.but1);button2=(Button)findViewById(R.id.but2);button3=(Button)findViewById(R.id.but3);button4=(Button)findViewById(R.id.but4);button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(!isBound){
final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
isBound=true;
}
}
});button4.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){ if(isBound){
isBound=false;unbindService(mConnection);
mathService=null;}
} });
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mathService==null){
editText3.setText(“未绑定服务”);
return;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.sub(a1, b1);
String msg=String.valueOf(a1)+“-”+String.valueOf(b)+
“=”+String.valueOf(result);
editText3.setText(msg);
} });
button3.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
if(mathService==null){
editText3.setText(“未绑定服务”);
return;
}
String a = editText1.getText().toString();
long a1 = Long.parseLong(a);
String b = editText2.getText().toString();
long b1 = Long.parseLong(b);
long result=mathService.compare(a1, b1);
if(result==1){
editText3.setText(a+“>”+b);
}
else if(result==0){
editText3.setText(a+“=”+b);
}
else {
editText3.setText(a+“<”+b);
}
} });} private ServiceConnection mConnection=new ServiceConnection(){
public void onServiceDisconnected(ComponentName arg0){
mathService=null;
}
public void onServiceConnected(ComponentName name, IBinder service){
mathService=((MathService.LocalBinder)service).getService();
} };}
实验六:SQLite实现用户的增删改查
一:实验目的
了解SQLite数据库的特点和体系及结构;
掌握SQLite数据库的建立和操作方法;
理解ContentProvide的用途和原理;
掌握ContentProvider的创建和使用方法。
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
使用SQlite数据库实现用户(包括:姓名,年龄,身高)的添加数据,全部显示,清除显示,全部删除,ID删除,ID查询,ID更新的功能。
四:实验核心代码
public class MainActivity extends ActionBarActivity { private EditText et_name;private EditText et_sex;private EditText et_department;private EditText et_id;private EditText et_salary;private MyOpenHelper oh;private SQLiteDatabase db;private TextView tv;private LinearLayout ll;@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, “test.db”, null, 1);
db = oh.getWritableDatabase();
et_name =(EditText)findViewById(R.id.et_name);
et_sex =(EditText)findViewById(R.id.et_sex);
et_department =(EditText)findViewById(R.id.et_department);
et_salary =(EditText)findViewById(R.id.et_salary);
et_id =(EditText)findViewById(R.id.et_id);
ll =(LinearLayout)findViewById(R.id.ll);}
public void add(View v){
db = oh.getWritableDatabase();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(“name”,name);
values.put(“sex”, sex);
values.put(“department”,department);
values.put(“salary”, salary);
db.insert(“staff”, null, values);
tv=new TextView(MainActivity.this);
tv.setText(“添加成功”);
db.close();} public void show(View v){
db = oh.getWritableDatabase();
Cursor cursor=db.query(“staff”, null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex(“_id”));
String name=cursor.getString(cursor.getColumnIndex(“name”));
String sex=cursor.getString(cursor.getColumnIndex(“sex”));
String department=cursor.getString(cursor.getColumnIndex(“department”));
String salary=cursor.getString(cursor.getColumnIndex(“salary”));
tv=new TextView(MainActivity.this);
tv.setText(“ID:”+id+“;”+“Name:”+name+“;”+“Sex:”+sex+“;”+“Department:”+department+“;”+“Salary”+salary);
ll.addView(tv);
}
db.close();} public void clear(View v){
ll.removeAllViews();} public void deleteAll(View v){
db = oh.getWritableDatabase();
db.delete(“staff”, null, null);
tv=new TextView(MainActivity.this);
tv.setText(“删除成功”);
db.close();}
public void deleteById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
db.delete(“staff”, “_id=?”, new String[]{id});
db.close();
tv=new TextView(MainActivity.this);
tv.setText(“ID删除成功”);} public void findById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
Cursor cursor=db.query(“staff”, null, “_id=?”, new String[]{id}, null, null, null, null);
while(cursor.moveToNext()){
id=cursor.getString(cursor.getColumnIndex(“_id”));
String name=cursor.getString(cursor.getColumnIndex(“name”));
String sex=cursor.getString(cursor.getColumnIndex(“sex”));
String department=cursor.getString(cursor.getColumnIndex(“department”));
String salary=cursor.getString(cursor.getColumnIndex(“salary”));
tv=new TextView(MainActivity.this);
tv.setText(id+“;”+name+“;”+sex+“;”+department+“;”+salary);
ll.addView(tv);
tv=new TextView(MainActivity.this);
tv.setText(“ID查询成功”);
}
db.close();} public void updateById(View v){
db = oh.getWritableDatabase();
String id=et_id.getText().toString();
String name=et_name.getText().toString();
String sex=et_sex.getText().toString();
String department=et_department.getText().toString();
String salary=et_salary.getText().toString();
ContentValues values=new ContentValues();
values.put(“name”,name);
values.put(“sex”, sex);
values.put(“department”,department);
values.put(“salary”, salary);
db.update(“staff”, values, “_id=?”, new String[]{id});
tv=new TextView(MainActivity.this);
tv.setText(“更新ID成功”);
db.close();} }
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,int version){
super(context, name, factory, version);}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(“create table staff(_id integer primary key autoincrement,name text,sex text,department text,salary float)”);}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){} }
五:运行结果截图
实验七:天气预报 一:实验目的
了解位置服务的概念;
掌握获取地理信息的方法;
二:实验设备
Eclipse 开发Android 应用 Android虚拟设备(AVD)
三:实验内容
写一个项目,实现显示天气预报的用户界面,显示已发送SMS短信的用户界面,不同地区天气的转换
四:实验核心代码
package com.example.weather;
import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;
import net.sf.json.JSONArray;import net.sf.json.JSONObject;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;
import com.zy.bean.Sms;import com.zy.bean.Weather;
public class MainActivity extends Activity { private MyConn conn = new MyConn();;private EditText et_city;private TextView tv_result;private ImageView iv_weather;private Handler handler;private Intent intent;private MyOpenHelper oh;private ServiceFunctions sFunctions;private MyArrayAdapter myArrayAdapter = null;private ListView lv;private int a = 1;private Weather weather;private List
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oh = new MyOpenHelper(MainActivity.this, “weatherdemo.db”, null, 1);
// System.out.println(“数据库创建完”);
et_city =(EditText)findViewById(R.id.et_city);
tv_result =(TextView)findViewById(R.id.tv_result);
iv_weather =(ImageView)findViewById(R.id.iv_weather);
lv =(ListView)findViewById(R.id.lv);
// System.out.println(“lv找到了”);
intent = new Intent(this, MyService.class);
startService(intent);
Toast.makeText(MainActivity.this, “服务启动”, 0).show();
bindService(intent, conn, BIND_AUTO_CREATE);
Toast.makeText(MainActivity.this, “服务绑定”, 0).show();
handler = new Handler(new Handler.Callback(){
@Override
public boolean handleMessage(Message msg){
final Weather weather =(Weather)msg.obj;
tv_result.setText(weather.toString());
}
new Thread(new Runnable(){ @Override public void run(){
// TODO Auto-generated method stub
try {
URL url = new URL(weather.getDayPictureUrl());
HttpURLConnection con =(HttpURLConnection)url
.openConnection();
con.setRequestMethod(“GET”);
if(con.getResponseCode()== 200){
final Bitmap bitmap = BitmapFactory
.decodeStream(con.getInputStream());
runOnUiThread(new Runnable(){
}
@Override
public void run(){
// TODO Auto-generated method stub
iv_weather.setImageBitmap(bitmap);
}
});}
} catch(Exception e){
// TODO Auto-generated catch block e.printStackTrace();}
}).start();
return false;} });class MyConn implements ServiceConnection {
@Override public void onServiceConnected(ComponentName name, IBinder service){ sFunctions =(ServiceFunctions)service;} @Override public void onServiceDisconnected(ComponentName name){
} } class MyArrayAdapter extends ArrayAdapter
} public MyArrayAdapter(Context context, int resource,int textViewResourceId, List
sFunctions.insertInfo(weather, oh);
a++;} else {
sFunctions.updateInfoById(“1”, weather, oh);} Toast.makeText(MainActivity.this, “保存天气信息成功”, 0).show();} public void show(View view){ smsList = sFunctions.findAll(oh);if(smsList.size()> 0){
List
for(Sms sms : smsList){
String s = sms.toString();
sList.add(s);
}
if(sList.size()> 0){
myArrayAdapter = new MyArrayAdapter(MainActivity.this,R.layout.second, R.id.tv_show, sList);
lv.setAdapter(myArrayAdapter);
} } }
public void getWeather(View view){
new Thread(new Runnable(){
String city = et_city.getText().toString();
@Override
public void run(){
try {
URL url = new URL(“http://api.map.baidu.com/telematics/v3/weather?location=”
+ URLEncoder.encode(city)
+ “&output=json&ak=QLZmpAbwFlWreQ28kLVgvKEC”);
HttpURLConnection con =(HttpURLConnection)url
.openConnection();
con.setRequestMethod(“GET”);
int code = con.getResponseCode();
if(code == 200){
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
JSONObject json = JSONObject.fromObject(reader
.readLine());
// System.out.println(obj.toString());
JSONArray array = json.getJSONArray(“results”);
JSONObject obj = array.getJSONObject(0);
JSONObject weather_data = obj.getJSONArray(“weather_data”).getJSONObject(0);
weather = new Weather(obj.getString(“currentCity”), obj
.getString(“pm25”), weather_data
.getString(“date”), weather_data
.getString(“weather”), weather_data
.getString(“wind”), weather_data
.getString(“temperature”), weather_data
.getString(“dayPictureUrl”), weather_data
.getString(“nightPictureUrl”));
Message msg = new Message();
msg.obj = weather;
handler.sendMessage(msg);
}
} catch(Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();} }
package com.example.weather;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, CursorFactory factory,int version){
super(context, name, factory, version);}
@Override public void onCreate(SQLiteDatabase db){
db.execSQL(“create table sms(_id integer primary key autoincrement,sms_sender text,sms_body text,sms_receive_time text,return_result text)”);
db.execSQL(“create table weatherinfo(_id integer primary key autoincrement,info text)”);}
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
} }
package com.example.weather;
import java.util.List;
import android.app.Service;import android.content.Intent;import android.content.ServiceConnection;import android.os.Binder;import android.os.IBinder;
import com.zy.bean.Sms;import com.zy.bean.Weather;
public class MyService extends Service { private ISmsDaoImpl daoImpl;private MyBinder myBinder = new MyBinder();
@Override public IBinder onBind(Intent intent){
return myBinder;}
@Override public void unbindService(ServiceConnection conn){
super.unbindService(conn);}
class MyBinder extends Binder implements ServiceFunctions{
public long insertSms(Sms sms,MyOpenHelper oh){
return MyService.this.insertSms(sms,oh);
}
public List
return MyService.this.findAll(oh);
}
public long insertInfo(Weather w,MyOpenHelper oh){
return MyService.this.insertInfo(w,oh);
}
public int updateInfoById(String id, Weather w,MyOpenHelper oh){
return MyService.this.updateInfoById(id, w,oh);
} }
public long insertSms(Sms sms,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertSms(sms);
return id;}
public List
daoImpl=new ISmsDaoImpl(oh);
List
return smsList;}
public long insertInfo(Weather w,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
long id = daoImpl.insertInfo(w);
return id;}
public int updateInfoById(String id, Weather w,MyOpenHelper oh){
daoImpl=new ISmsDaoImpl(oh);
int num = daoImpl.updateInfoById(id, w);
return num;} } 五:运行结果截图
篇2:安卓数据库实验报告
六
SQL语言数据查询语言DQL
一、实验内容
了解SQL语言的SELECT语句对数据的查询,学会在Navicat for MySQL中用SELECT语句对表中的数据进行简单查询、连接查询、嵌套查询和组合查询。
启动Navicat for MySQL,用SELECT语句进行简单查询操作,具体实验步骤如下:(实验步骤里的内容)
1启动Navicat for MySQL,登录到本地数据库服务器后,连接到test数据库上。用Create Table建立Student表、Course表和Choose表:
2.用INSERT语句分别向Student表中插入3个元组、Course表中插入3个元组、Choose表中插入7个元组:
4.用SELECT语句的between„and„表示查询条件,查询年龄在20~23岁的学生信息。
5.用SELECT语句的COUNT()聚集函数,统计Student表中学生总人数。
6.分别用SELECT语句的max()、min()、sum()、avg()四个聚集函数,计算Choose表中C1课程的最高分、最低分、总分、平均分。
7.用SELECT语句对空值(NULL)的判断条件,查询Course表中先修课称编号为空值的课程编号和课程名称。
8.用SELECT语句的连接查询,查询学生的学号、姓名、选修的课程名及成绩。
9.用SELECT的存在量词EXISTS,查询与“张三”在同一个学院学习的学生信息。
10.用SELECT语句的嵌套查询,查询选修C1课程的成绩低于“张三”的学生的学号和成绩。
11.用SELECT语句的组合查询(UNION),查询选修了C1课程或者选修了C3课程的学生学号。
12.用SELECT语句的组合查询(UNION)与DISTINCT短语,查询选修了C1课程或者选修了C3课程的学生学号,并取消重复的数据。
二、遇到的问题及解决
该实验中,由于对SQL中语句的不熟悉,多次导致了输入错误,得不到实验结果,对存在量词EXISTS陌生,不熟悉,导致实验步骤中的13小题无法根据题目要求完成,要对书本上的知识加以熟悉。
三、心得体会
篇3:安卓手机与数据库交互系统的设计
关键词:安卓,数据库,交互系统
在国内移动互联网络已经进入一个新的时代, 随着4G网络的发展普及, 手机硬件性能的提高, 让智能手机有了更强大的功能, 在实现最基本的通讯功能的同时, 也可以让用户安装各种应用程序, 手机也在逐渐实现着电脑的一些功能, 而安卓手机软件的开发离不开数据的存储, 查询等操作内容, 只有深入了解安卓手机系统中对数据的处理, 才能更好实现安卓手机与数据库的交互, 在促进安卓手机数据之间的传送的同时也要保证其传输过程中的安全性和时效性, 开发设计出更多优秀的应用软件。
1安卓手机与数据库交互系统的设计
1.1消息驱动模块的设计思路
消息驱动就是指把复杂的事情简单化, 把复杂的数据交互转化为多个单一的模块, 然后对分解后的模块逐一进行功能分析。我们把各个消息模块化的好处:
(1) 把复杂数据模块化简化通信协议的难度, 并且降低了交互系统开发研究的难度。
(2) 把消息模块化有助于准确快速的找到问题所在点, 并进行维修。
(3) 灵活性高, 促进交互系统的升级和完善。
(4) 消息驱动的模块在交互与系统中, 能够直接控制手机端传输的数据, 避免不需要的信息碰撞, 减少信息的传送量, 进而提高交互过程中的时效性。
(5) 采用消息驱动模式能够判断数据是否合法, 能够拦截各种非法的信息, 减少非法信息的恶意攻击, 实现数据传输安全性。
1.2安卓网络通信API分析
在Android系统的软件开发工具包中, 能够通过多种不同的方式实现Web服务器之间的交互。超文本传输的有http response类, 用set entity方法把客户端数据提交到服务器, http response类用execute方法获得服务器端返回的信息。在tcp协议中有socket (套接字) 。文件传输可以用httpurlconection类getinputstream和getoutputstream方法获取输入输出流。在inputstream, Outputstream, fileinpu tstream, 类使用write、writebyte和read方法用于读写输入输出流。
1.3 Servlet和JDBC技术分析
Servlet是用于java编辑的服务器端程序, 主要功能是用于交互浏览和修改数据, 生成Web内容, 其中doget和dopost方法主要用于接受用户请求, 以及对用户的响应。Servlet主要完成的工作内容是控制, 它能够动态的向客户端发送消息。JDBC是一个配置文件, 为各种类型的数据库提供了统一的访问标准, 利用它可以实现多种数据库的访问。JDBC技术访问数据库的流程。
1.4 Sqllite技术分析
Sqllite是一种适用于便携设备的嵌入式数据库, 它比其他嵌入式数据库在性能上有着一定的优势, 内存空间占用少, 安全性高, 成本低, 实用性很强, API易用性强等特点, 能够高效的利用嵌入式系统中的资源, 提高数据的提取速度, 是嵌入式系统开发非常好的平台。
1.5安卓手机与数据库交互系统的具体设计
根据对安卓的通信网络API的研究分析, servlet技术, sqllite技术分析、JDBC相应技术的分析, 提出对应的交互方案, 利用安卓的系统中相应的无线通讯接口, 向服务器提交相应的语句, 并利用相应的servlet技术中的request对象进行信息的智能, 然后用JDBC相对的技术执行语句, 通过实际的客户端实现信息数据传入到手机中。在现实的交互过程中, 最主要表现在两个方面, 首先是实现手机与Web服务器之间的通信。再者是展开Web服务器之间的交互工作。在进行模型设计的过程中, 可以利用交互式的方式实现数据的传输。安卓手机端与远程数据库端交互运行过程如图1。
2安卓手机与数据库交互系统的实现
交互系统的完成主要是处理好安卓手机端和Web服务器之间的关系。收起客户端主要有五个模块组成, 分别是初始化模块, 字符发送模块, 文件接收, 字符串接受和文件发送模块。在交互系统的设定过程中, 首先收集信息, 对其实际信息进行调控, 通过不同的数据传输模式与控制体现不同的操作模式。比如手机端发送的信号是111交互过程中a-b-c-d-e-f, 具体的流程是通过简单的数据将实际的信号进行传输, 并通过简单的操作, 执行语句操作的模块, 获取相信的信息。数据交互的模式不同, 在实际的信息处理过程中, 实际交互的模式相对较多。
安卓系统实现与程序语言的配合, 完善整个交互的实现。安卓模块的实现安卓端设计的软件主要采用的是java编辑语言进行开发完成的。而在实现安卓客户端模块主要包括字符串接受模块, 其主要采用http Post对象来完成信息的收发。文件发送模块:浏览器可以自动按照协议把文件封装起来, 所以在添加表单附件时将文件传送到服务器, 主要用到的提交方式为post, 使用Data Out Stream建立输出流, 使用write Byte方法和write方法将信息头、文件的二进制和信息为写入到输出流。文件接收模块:利用http URlconnection对象连接Web服务器。Web服务器端实现的功能模块:字符信息的收发模块, 信息判断模块以及SQL语句执行模块, 反馈信息模块和文件入库模块。各个模块之间相互依存, 又相互作用, 再通过编辑语言来实现信息数据的传递, 让交互系统最终得以实现。
3结语
在原有的技术层面上留取精华, 去其劣势, 理论分析把安卓手机的无线通信技术与Servlet和JDPC技术相结合, 以及对Sqllite技术分析, 实现手机与数据库相互间交互。技术在发展, 时代在进步, 信息技术也应与时俱进, 手机客户端与信息通讯技术的结合发展促进了数据之间的传递, 实现了信息共享, 促进了社会信息的发展进步, 信息的安全性也在逐渐提高。
参考文献
[1]何璇.基于Java语言的安卓手机软件开发[J].计算机光盘软件与应用, 2014, 08:67-68.
篇4:数据库实验课中项目教学法的实践
本校计算机专业的数据库课程在教授过程中主要由两部分组成:一是理论讲解,该过程旨在使学生通过老师对概念的分析和解释,掌握数据库的理论知识;二是课程实验,教师通过这个过程检验学生对知识的掌握程度。传统的实验课只是理论课的补充,每个实验的内容之间的联系不明显。而中职学生又缺乏对知识总结归纳的能力,即使能完成每一个独立的实验,但却不能将知识联系贯穿形成知识脉络并应用起来,出现理论掌握和实际操作相脱离的想象。这样的课程实验达不到培养学生解决实际问题的目的,失去了在课程教授过程中设置实验课原本的用意。因此,在本文探索在数据库的实验课程中进行项目教学实践,以期培养学生进行知识总结归纳能力以及解决问题能力。
一、数据库实验课中运用项目教学法的理论基础
建构主义学习理论是项目教学法的理论基础。建构主义学习理论认为,知识不是通过教师传授得到,而是学习者在一定的情境即社会文化背景下,借助其他人(教师或学习伙伴)的帮助,利用必要的学习资料,通过意义建构的方式而获得。以此为理论依据的项目教学法,强调将与实际联系密切的项目引入教学过程,学生在老师的指导下,通过信息的收集、方案的设计、项目实施及最终评价的过程,将学习的知识进行总结归纳并加以运用来完成项目的要求。
在数据库实验课中运用项目教学方法,学生在完成具体项目的过程中,需要对所学知识进行回忆,将分散的知识进行归纳,继而完成项目中的各项要求。在这个过程中,不但能提高学生总结归纳能力,也能提高学生动手解决实际问题的能力。项目完成后,学生对数据库课程的知识脉络会有更深刻的理解,最终提高数据库实验课的教学效果。
二、实验课项目教学的实施
1. 项目教学中实验内容设计及组织
在数据库实验课中运用项目教学法的过程中,既要保证学生能充分掌握每一节课的理论内容,又要保证实验内容可以将理论课中的知识点有机结合,融汇贯通,形成完整的知识脉络,同时还要兼顾项目的阶段性、连续性和知识难度的层次性。因此,作者将实验设计为由基础实验和综合实验两部分共同组成。
基础实验是以往教学过程中为巩固理论知识而设计的教学实验环节。这个部分的实验内容的设计主要依据相应的理论课知识。在课程开始前,教师首先选择一个学生较为熟悉的项目,根据课程的理论知识点,把项目划分为若干个小项目。教师在理论课中穿插演示相关小项目的操作过程,促使学生对抽象的概念有一个形象的认识,并加深他们对知识点如何在实际中的应用的理解。理论课后,为了巩固所学知识,教师会要求学生根据课上的小项目的任务进行练习,并将操作过程及结果汇总成为实验报告提交。由此可见,将基础实验贯穿到理论教学中,不但能对教学起到很好的补充作用,而且可以加深学生对知识点的理解和掌握。
在数据库课程中,笔者选取“学生成绩管理系统”作为贯穿这门课程的基础实验项目。实验内容的设计如表1。
综合实验是教师为了检验学生能否能将知识理解并加以应用,最终解决实际问题而设计的。综合实验涉及的知识内容覆盖整个课程,因此,实验会设计在理论课程教学任务基本完成后,在学期的最后一周进行。由于时间的限制,学生独立完成整个项目的要求有一定的难度。所以为了更好地组织实验,教师会根据学生在基础实验中的成绩将3~4个学生按分为一组,以小组协作的方式完成实验。其中这3到4人中保证有1~2个学生是成绩中上的,1~2个学生是成绩较差的。这种“以好带差”的方式,一方面可以加深好学生对知识的理解,增强他们与人沟通协作的能力。另一方面也可以促进成绩较差学生的学习能力的提升,激发其学习兴趣。本课程中,笔者选取“图书借阅管理系统”作为综合实验项目。实验内容要求如表2。
2. 实验考核方法
实验是数据库课程教学中重要的组成部分。为了体现课程实验的重要性,将实验成绩纳入到期末考试的总评成绩中是非常必要的。其中,基础实验主要检验学生对知识点的掌握程度,教师主要以学生提交的实验报告作为考核成绩的依据。综合实验部分,着重考核学生综合运用知识解决实际问题的能力,考核内容主要包含实验过程的规范性、实验结果的正确性、解决方案的合理性等。综合实验部分的成绩考核,主要依据学生汇报演示PPT制作的效果,教师、其他组同学对设计的合理性、正确性等方面进行提问时汇报小组学生进行回答的状态,最后由教师给出小组综合实验成绩。因此,综合汇报所涉及的知识面和工作量都较基础实验要广泛,综合实验更能体现学生各方面能力优劣。因此,笔者设计基础实验的成绩占实验成绩的30%,而综合实验的成绩占实验成绩的70%。
三、项目教学的效果
1. 改变教学方法,提高学生学习能力
通过在实验课中采用项目教学法,以项目的方式将学习内容串联起来,学生在学习过程中手脑并用,使教学效果直观,提高了学生学习数据库的兴趣。而且在这个过程中不断地向学生传递解决问题和分析问题的基本方法,培养了学生全面、系统的思维方式。
2. 改革考核方法,激发学生自主学习
课程的考核成绩,采用理论成绩与实验成绩相结合的评价方式,使学生意识到学习不能单纯纸上谈兵,死记理论不再能帮助他们在考试中取得好的成绩。要取得好的成绩必须在掌握理论知识的同时,不断提高自己的动手能力。学会在项目试验过程中遇到问题时,通过自主分析,归纳总结,寻求方法解决问题。学生可以从中体会到学习的乐趣,从而提高学生学习的兴趣。考核最终成为激发学生学习兴趣的手段。
3. 注重实践教学,培养创新能力
学生通过基础实验过程,不仅能完成数据库课程所规定的实训内容,对数据库有更加感性和直观的认识。同时,完成综合实验环节的设计过程需要学生全面地考虑数据设计的合理性、完整性以及相关约束条件,经过这个过程可以培养学生自主学习的能力,促进学生自觉主动地思考、探索,进一步从理论和实践中汲取知识,开拓思维,有助于培养学生创新意识。
四、结束语
在数据库课程实验中采项目教学实践,能使学生理解数据库基本理论,巩固数据库的基本操作,了解应用系统后台数据库设计过程,增强学生自主学习研究、分析解决实际问题的能力,培养团队协作精神。这些都将为学生后续课程的学习、未来走上工作岗位奠定良好的基础。
篇5:SQL数据库实验报告 实验二
1.实验目的(1)了解SQL Server 数据库的逻辑结构和物理结构的特点。
(2)掌握使用SQL Server管理平台对数据库进行管理的方法。
(3)掌握使用Transact-SQL语句对数据库进行管理的方法。
2.实验内容及步骤
(1)在SQL Server管理平台中创建数据库。
① 运行SQL Server管理平台,在管理平台的对象资源管理器中展开服务器。
② 右击“数据库”项,在快捷菜单中选择“新建数据库”菜单项。在新建数据库对话框的数据库名称文本框中输入学生管理数据库名studentsdb,单击“确定”按钮。
(2)选择studentsdb数据库,在其快捷菜单中选择“属性”菜单项,查看“常规”、“文件”、“文件组”、“选项”、“权限”和“扩展属性”等页面。
(3)打开studentsdb数据库的“属性”对话框,在“文件”选项卡中的数据库文件列表中修改studentsdb数据文件的“分配的空间”大小为2MB。指定“最大文件大小”为5MB。修改studentsdb数据库的日志文件的大小在每次填满时自动递增5%。
(4)单击“新建查询”打开查询设计器窗口,在查询设计器窗口中使用Transact-SQL语句CREATE DATABASE创建studb数据库。然后通过系统存储过程sp_helpdb查看系统中的数据库信息。
(5)在查询设计器中使用Transact-SQL语句ALTER DATABASE修改studb数据库的设置,指定数据文件大小为5MB,最大文件大小为20MB,自动递增大小为1MB。
(6)在查询设计器中为studb数据库增加一个日志文件,命名为studb_Log2,大小为5MB,最大文件大小为10MB。
(7)使用SQL Server管理平台将studb数据库的名称更改为student_db。
(8)使用Transact-SQL语句DROP DATABASE删除student_db数据库。
3.实验思考
(1)数据库中的日志文件是否属于某个文件组?
(2)数据库中的主数据文件一定属于主文件组吗?
(3)数据文件和日志文件可以在同一个文件组吗?为什么?
(4)删除了数据库,其数据文件和日志文件是否已经删除?是否任何人都可以删除数据库?
篇6:数据库实验报告
计算机科学与技术学院
实验报告
(2013 ~2014 学
第二学期)
课程名称 实验名称
数据库原理与技术
姓名 张涛 学号 20124350230
专业 软件工程
班级 02班
地点
教师 刘征海 实验1 认识DBMS 一.实验题目
认识DBMS 二.实验要求
1.利用管理工具创建数据库、表和表间关系。
实验目的和注意事项 基本操作,进一步理解数 据库、表、表间关系的概念。
注意事项:创建数据库和数据表时应认真,如果出现错误,应相应地修改结构或删除。三.实验代码(内容)
(1)利用SQL Server Management Studio 创建数据库,名称为【学生选课
YYXXXX】。其中YY为专业代号,计算机为JS,软件工程为RJ,网络为WL,数媒为
SM;XXXX为各位同学的学号中的最后四位 实验目的:熟悉SQL Server Management Studio
(2)在【学生选课YYXXXX】中建立数据表,表的定义如下所示。
学生YYXXXX(学号,姓名,性别,出生日期,院系名称,备注);
课程YYXXXX(课程号,课程名,先行课,学分); 选修YYXXXX(学号,课程号,分数)。
要求定义每张表的主码,为属性选择合适的数据类型,决定是否允许为空,为【性别】和【学分】属性定义默认值。
(3)定义表之间的关系。
(4)分别为表录入几行数据记录,同时练习数据的修改和删除操作
2.利用SQL 语句创建数据库、表和表间关系 实验目的和注意事项
实验目的:熟悉创建数据库和数据表的SQL 语句。
注意事项:输入SQL 语句时应注意,语句中均使用西文操作符号。
实验内容
在SQL Server Management Studio 中新建查询,实现以下操作。(1)用SQL 语句创建数据库,名称为“StudentCourseYYXXXX”。其中YYXXXX 为各位同学的学号中的最后四位。
(2)用SQL 语句创建StudentCourseYYXXXX 中的3 张表,同时指定主码、外 码、默认值等。
(3)直接在表数据窗口中录入表数据记录。
实验 2 交互式 SQL(1)
一、数据库单表查询 实验目的和注意事项
实验目的:掌握单表查询SELECT、FROM、WHERE 的用法,特别要掌握比较运 算符、逻辑运算符的使用。注意事项:子句WHERE<条件>表示元组筛选条件;子句HAVING<条件>表示元
组选择条件;子句HAVING<条件>必须和GROUP BY 子句配合使用;注意输入SQL语句时均应使用西文操作符号。实验内容
(1)创建查询窗口,设置查询环境。(2)单表查询 实验步骤
(1)选择要查询的数据库,右击【新建查询】,或者选择系统菜单中的【文
件】|【新建】|【使用当前连接查询】命令,或者单击标准工具栏中的【新建查
询】按钮,即可新建一个查询窗口。如果查询数据库不是StudentCourseYYXXXX,则可在可用数据库下拉列表中进行选择,或用USE 语句调用。
(2)在查询窗口中输入SELECT 查询语句,对StudentCourseYYXXXX 数据库 进行查询操作。
① 查询计算机系全体学生的信息
② 查询姓“李”的学生的学号和姓名。
③ 查询课程表中先行课为空的课程名。
④ 查询考试成绩有不及格的学生的学号。
⑤ 求选修了C1 课程或C2 课程的学生的学号及成绩。
⑥ 查询全体计算机系学生的姓名及其年龄。
⑦ 查询计算机系在1986-1987 年之间出生的学生的姓名。
⑧ 查询姓“李”的前两个学生的学号和姓名。
⑨ 查询选修了两门以上课程的学生学号与课程数。
⑩ 查询选修课程数大于等于2 的学生的学号、平均成绩和选课门数,并按平均成绩降序排列。
二、数据库多表连接查询 实验目的和注意事项
实验目的:理解多表查询的概念;掌握多表查询的SELECT、FROM、WHERE、JOIN子句的用法,特别要求比较内连接、外连接的结果。
注意事项:内连接、左外连接和右外连接的含义及表达方法;注意输入SQL 语 句时均应使用西文操作符号。实验内容
(1)创建查询窗口,设置查询环境。(2)多表复杂查询。实验步骤
新建查询窗口,选择StudentCourseYYXXXX 为当前数据库,输入如下SELECT 查询语句并执行,对数据库进行多表连接查询操作。(1)查询选修了【数据库原理】的计算机系的学生学号和姓名。
(2)查询每一门课的间接先行课(即先行课的先行课)。
(3)查询学生的学号、姓名、选修课程的名称和成绩。
(4)查询选修了课程的学生姓名。
(5)查询所有学生的信息和所选修的课程。
(6)查询已被选修的课程的情况和所有课程的名字。
(7)列出学生所有可能的选修情况。
(8)查找计算机系的学生选修课程数大于2 的学生的姓名、平均成绩和选课 门数,并按平均成绩降序排列。
实验 3 交互式 SQL(2)数据库嵌套查询和组合查询 实验目的和注意事项
实验目的:掌握查询中嵌套查询和组合查询的操作方法,进一步加深对 SELECT 语句的理解。
注意事项:子句的使用;注意语句的层次嵌套关系和括号的配对使用问题;
注意输入SQL 语句时均应使用西文操作符号。实验内容(1)创建查询窗口,设置查询环境。(2)分组查询。(3)统计查询。(4)嵌套查询。实验步骤
新建查询窗口,选择StudentCourseYYXXXX 为当前数据库,输入如下SELECT 查询语句并执行,对数据库进行嵌套查询和组合查询操作。
(1)统计选修了【数据库原理】课程的学生人数。
(2)查询没有选修【数据库原理】课程的学生信息。
(3)查询其他系中比计算机系学生年龄都小的学生。
(4)查询被0602001 学生或0602002 学生所选修的课程的课程号(用UNION 组合查询与IN 条件查询两种方法实现)。
(5)查询0602001 学生和0602002 学生同时选修的课程的课程号(用
INTERSECT 组合查询与EXISTS 嵌套子查询两种方法实现)。
(6)查询被0602001 学生选修,但没有被0602002 学生所选修的课程的课程
号(用EXCEPT 组合查询与NOT EXISTS 嵌套子查询两种方法实现)。
实验 4 交互式 SQL(3)数据的更新 实验目的和注意事项
实验目的:熟悉插入、修改和删除SQL 语句的用法。注意事项:对于INSERT 语句,要求理解默认值约束、空值约束在插入时所 起的作用。实验内容
(1)使用INSERT 语句在数据库的表中插入几行记录。(2)使用UPDATA 语句修改某个数据。(3)使用DELETE 语句删除某行记录。实验步骤
(1)新建查询窗口,选择StudentCourseYYXXXX 为当前数据库。
(2)在已建立StudentCourseYYXXXX 数据库和StudentsYYXXXX、CoursesYYXXXX、SCYYXXXX 3 个表的基础上,向StudentCourseYYXXXX数据库中 的表更新数据。
① 向表StudentsYYXXXX 中插入(0601001,赵林, 男,1985-09-08,计算机)的记录。
② 向SCYYXXXX 表中添加一个学生的选课记录,学号为0601001,所选的课
程号为C2。SC表中有Sno、Cno、Grade 这3 个列。这里只知道学号和课程号,不知道成绩值。
③ 向表StudentsYYXXXX 中插入(0601002,张修雨,default)记录,该记录 的数据中default 表示默认值‘男’,其他数据表示空值。
④ 用CREATE 语句建立表StudentBAK1YYXXXX,包含(与Students 的Sno、Sname、Sdept 相同)3 个字段,然后用INSERT SELECT 语句实现向
StudentBAK1YYXXXX 添加StudentsYYXXXX 表中的计算机系学生的学号、姓名、所在系的信息。
⑤ 用 SELECT...INTO 语句实现把StudentsYYXXXX 表中1986 年后(包含
1986 年)出生的学生的学号、姓名存储到一个新表StudentBAK2YYXXXX。
⑥ 将姓名为【赵林】的同学的所在系改为【机电系】,爱好改为【足球】。
⑦ 将选修了课程名为【数据库原理】的学生成绩加5 分。⑧ 将StudentCourseYYXXXX
数据库的StudentBAK1YYXXXX 表中所有姓赵的 同学删除。
⑨ 删除计算机系选修成绩不及格的学生选修记录。⑩ 将除。StudentCourseYYXXXX
数据库的StudentBAK2YYXXXX 表中的所有行删
四.实验总结
相关文章:
安卓专业毕业论文题目01-20
节约粮食拒绝浪费从我做起倡议书01-20
山西大学中华茶艺传承协会成立大会01-20
《三国志》读后感800字01-20
感恩伟大的父亲满分作文01-20
幼儿园毕业典礼主持词煽情 幼儿园毕业典礼主持词(十三篇)01-20
2015年安卓APP安全漏洞分析报告01-20
幼儿园毕业典礼主持词串词 幼儿园毕业典礼主持词煽情(优质十四篇)01-20
计算机控制技术与应用论文题目01-20