一、单元测试junit
过程:
1.可以定义一个类去继承AndrTestCase类,在类中定义方法,即可测试该方法
2.在配置单元测试的环境时,注意要在清单文件中添加添加指令集和应用类库
3.在调试时,对某一给定的方法可以在eclipse中run-->android Junit test,进行单个方法的测试。
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<span style="color:#ff0000;"> <instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima.junit"
></instrumentation></span>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<span style="color:#ff0000;"><uses-library android:name="android.test.runner"/></span>
<activity
android:name="com.itheima.junit.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
二、SQLite数据库
是一个轻量级数据库,创建数据库类需要用到SQLLiteOpenHelper
public class MyOpenHelper extends SQLiteOpenHelper {
<span style="white-space:pre"> </span>//arg1:当前上下文对象;arg2:创建数据库文件名字;arg3:游标工厂;arg4:数据库版本
public MySqlHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
<span style="white-space:pre"> </span>//数据库创建时,此方法会调用
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
<span style="white-space:pre"> </span>//在创建数据库时,创建表
db.execSQL("create table message(_id integer primary key autoincrement,name char(10),salary char(20),phone integer(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
System.out.println("升级成功");
}
}
创建一个数据库
<span style="white-space:pre"> </span>MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再获取可读可写的数据库对象,如果数据库存在,就直接打开
SQLiteDatabase db = oh.getWritableDatabase();
对表的操作:增删改查
方法一:增删改用到db.execSQL(String sql)方法;查询用rawQuery()方法
public void update(){
db.execSQL("update person set phone = ? where name = ?", new Object[]{186666, "小志的儿子"});
}
public void select(){
<span style="white-space:pre"> </span>//Cursor返回的相当于是一个结果集
Cursor cursor = db.rawQuery("select name, salary from person", null);
while(cursor.moveToNext()){
//通过列索引获取列的值,这里getString()也可以直接传递对应表中的字段下标(如:0,1,2等)
String name = cursor.getString(cursor.getColumnIndex("name"));
String salary = cursor.getString(1);
System.out.println(name + ";" + salary);
}
}
方法二:用Android中提供的api
public void insert_1(){
for(int i=0;i<50;i++){
ContentValues values=new ContentValues();
values.put("name", "lucy"+i);
values.put("salary", "135"+i+i);
values.put("phone", "23"+i+i);
db.insert("message", null, values);
}
}
public void deleteApi(){
db.delete("message", "name=?", new String[]{"tom"});
}
public void updateApi(){
ContentValues values=new ContentValues();
values.put("salary", "50000");
db.update("message", values, "name=?", new String[]{"lucy"});
}
public void selectApi(){
Cursor cursor= db.query("message", new String[]{"name","salary"}, "name=?", new String[]{"tom"}, null, null, null,null);
while(cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex("name"));
String salary=cursor.getString(cursor.getColumnIndex("salary"));
Log.d("hehehehh", name+";"+salary);
}
}
注:上面两种方法调用完毕后,都应该关闭数据库db.close()方法,还可以封装在方法teardown()方法中,自动执行
//调用结束后,调用此方法。
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
db.close();
}
数据库的事务
保证事务中的所有sql语句要么一起成功执行,要么一起失败
新建一个内部类,用来继承BaseAdapter,这里面重写四个方法,getCount返回数据列表的数量;getView中设置布局填充器把所相要的数据显示到页面上
四、对话框
public void transaction(){
try {
db.beginTransaction();
ContentValues values=new ContentValues();
values.put("salary", "30000");
db.update("message", values, "name=?", new String[]{"小子"});
values.clear();
values.put("salary", "20000");
db.update("message", values, "name=?", new String[]{"tom"});
db.setTransactionSuccessful();
}
finally{
db.endTransaction();
}
}
三、数据显示到屏幕
把数据库的数据显示到屏幕
<span style="white-space:pre"></span>public class MainActivity extends Activity {
<span style="white-space:pre"> </span>List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
personList = new ArrayList<Person>();
//把数据库的数据查询出来
MyOpenHelper oh = new MyOpenHelper(this);
SQLiteDatabase db = oh.getWritableDatabase();
Cursor cursor = db.query("person", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
<span style="white-space:pre"> </span>String _id = cursor.getString(0);
<span style="white-space:pre"> </span>String name = cursor.getString(1);
<span style="white-space:pre"> </span>String salary = cursor.getString(2);
<span style="white-space:pre"> </span>String phone = cursor.getString(3);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>Person p = new Person(_id, name, phone, salary);
<span style="white-space:pre"> </span>personList.add(p);
}
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
新建一个内部类,用来继承BaseAdapter,这里面重写四个方法,getCount返回数据列表的数量;getView中设置布局填充器把所相要的数据显示到页面上
屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传
入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存
class MyAdapter extends BaseAdapter{
//系统调用,用来获知集合中有多少条元素
@Override
public int getCount() {
return personList.size();
}
//由系统调用,获取一个View对象,作为ListView的条目
//position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Person p = personList.get(position);
View v = null;
//判断条目是否有缓存
if(convertView == null){
//把布局文件填充成一个View对象
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
}
else{
v = convertView;
}
//获取布局填充器对象
<span style="white-space:pre"> </span>// LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
<span style="white-space:pre"> </span>// 使用布局填充器填充布局文件
<span style="white-space:pre"> </span>// View v2 = inflater.inflate(R.layout.item_listview, null);
<span style="white-space:pre"> </span>// LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
<span style="white-space:pre"> </span>// View v3 = inflater2.inflate(R.layout.item_listview, null);
//通过资源id查找组件,注意调用的是View对象的findViewById
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
tv_name.setText(p.getName());
TextView tv_phone = (TextView) v.findViewById(R.id.tv_phone);
tv_phone.setText(p.getPhone());
TextView tv_salary = (TextView) v.findViewById(R.id.tv_salary);
tv_salary.setText(p.getSalary());
return v;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
四、对话框
分为提示对话框,单选对话框和多选对话框
直接上例子吧,相对而言比较简单
public void click1(View v){
<span style="white-space:pre"> </span>//使用创建器,生成一个对话框对象
AlertDialog.Builder dialog=new Builder(this);
dialog.setTitle("提示");
dialog.setMessage("长点心把");
dialog.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "你点击了确定", 1).show();
}
});
dialog.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "取消该提示",0).show();
}
});
dialog.show();
}
public void click2(View v){
AlertDialog.Builder dialog=new Builder(this);
dialog.setTitle("单选框");
final String [] str=new String[]{"男","女","两性"};
dialog.setSingleChoiceItems(str, -1, new OnClickListener() {
//which:用户所选的条目的下标
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.dismiss();
Toast.makeText(MainActivity.this, str[which]+"",1).show();
}
});
dialog.show();
}
public void click3(View v){
AlertDialog.Builder dialog=new Builder(this);
dialog.setTitle("多选框");
final String[] str=new String[]{"电影","音乐","读书","电脑"};
final boolean[] bool=new boolean[]{true,true,false,false};
dialog.setMultiChoiceItems(str, bool, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// TODO Auto-generated method stub
bool[which]=isChecked;
}
});
dialog.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String val="";
for(int i=0;i<bool.length;i++){
if(bool[i]){
val+=str[i];
}
}
//val += bool[i]? str[i] + "," : "";
dialog.dismiss();
Toast.makeText(MainActivity.this, val, 1).show();
}
});
dialog.show();
}