Android,數據存儲和界面

一、單元測試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語句要麼一起成功執行,要麼一起失敗
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();
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章