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();
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值