一、單元測試junit
過程:
<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數據庫
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();
對錶的操作:增刪改查
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中提供的apipublic 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();
}
數據庫的事務
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中設置佈局填充器把所相要的數據顯示到頁面上
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();
}