文档章节

数据库操作,BaseAdapter适配器

chenruibing
 chenruibing
发布于 2015/05/26 16:57
字数 1630
阅读 1046
收藏 1

listView设置适配器BaseAdapter

通过执行sql语句操作数据库

通过api方式操作数据库

testTransaction事务回滚

listView设置适配器BaseAdapter

package com.heima.sqlitedemo;

import java.util.List;

import com.heima.dao.PersonDao;
import com.heima.entites.Person;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Sqlite_DBActivity extends Activity {
    private List<Person> personList;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        
        ListView listView = (ListView) findViewById(R.id.listview);
        
        PersonDao dao = new PersonDao(this);
        personList = dao.getAll();
        //把view层对象ListVew和控制器BaseAdapter关联起来
        listView.setAdapter(new MyAdapter());
    }
    
    //关联起来之后就会调用适配器的四个方法   主要是getCount和getView
    class MyAdapter extends BaseAdapter{

    	//定义ListView的数据的长度
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return personList.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		//此方法返回的是ListView列表中某一行的View对象   ListView就是一行一行的TextView
		//position 当前返回的view的索引位置
		//converView缓存对象    例如往下拉时可以把上面的view对象缓存起来
		//parent就是ListView对象    一般用不到
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			//这里的上下文是MyAdapter,所以不能直接this,this是Sqlite_DBActivity
			TextView tv = null;
			Log.i("adapter", "textview: " + position);
			
			if(convertView != null){ //判断缓存对象是否为null,不为空时已经缓存了对象
				tv = (TextView) convertView;
			}else{ //等于null说明第一次显示,则TextView都是新创建的
				tv = new TextView(Sqlite_DBActivity.this);
			}
			//不使用缓存的话,就是每一次都new一个TextView   目的是只有几个TextView不断复用
			
			tv.setTextSize(16);
			
			Person person = personList.get(position);
			tv.setText(person.toString());
			
			return tv;
		}
    	
    }
}
建立数据库
package com.heima.sqlitedemo.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

//继承的是数据库帮助类,用于创建和管理数据库的
public class personSQLITEOpenHelper extends SQLiteOpenHelper {

	//只剩下Context   其他都删掉
	public personSQLITEOpenHelper(Context context) {
		//第一参数   上下文
		//第二参数   数据库名字
		//第三参数   游标集   可以自定义,默认使用已有的。。一般都是默认
		//第四参数   版本号   至少从1开始
		super(context, "heima_Db", null, 2);
		// TODO Auto-generated constructor stub
	}

	//数据库第一次创建时会调用这个方法
	//一般用来初始化一些表
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		//创建表
		String sql = "create table person(_id integer primary key,name varchar(20),age integer);";
		//执行sql语句
		db.execSQL(sql);
	}

	
	//数据库的版本号更新时会调这个方法
	//更新数据库的内容   对表进行增删改查
	//一运行就更新    上面构造函数的版本号必须修改
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
		if(oldVersion == 1 && newVersion == 2){ //在person表中添加一个余额列balance
			Log.i("alter", "alter");
			db.execSQL("alter table person add balance integer;");
			
		}
		
	}

}
通过执行sql语句操作数据库
package com.heima.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.heima.entites.Person;
import com.heima.sqlitedemo.db.personSQLITEOpenHelper;

public class PersonDao {
	private personSQLITEOpenHelper mOpenHelper;

	public PersonDao(Context context){
		mOpenHelper = new personSQLITEOpenHelper(context);
	}
	
	//添加person数据  
	public void insert(Person person){
		//获取只写的数据库
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		//判断数据库是否打开
		if(db.isOpen()){//如果打开就执行添加的操作
			
			//执行添加操作
			//拼接字符串
//			db.execSQL("insert into person(name, age) values('lisi', 19)");
			//可以传递参数的方式      这样还可以防止sql注入
			db.execSQL("insert into person(name, age) values(?,?)", new Object[]{person.getName(),person.getAge()});
			
			//打开就要记得关掉
			db.close();
		}
	}
	
	public List<Person> getAll(){
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		List<Person> personList = new ArrayList<Person>();
		if(db.isOpen()){
			Cursor cursor = db.rawQuery("select _id, name, age from person", null);
			if(cursor!=null && cursor.getCount()>0){
				int id;
				String name;
				int age;
				
				while(cursor.moveToNext()){
					id = cursor.getInt(0);
					name = cursor.getString(1);
					age = cursor.getInt(2);
					personList.add(new Person(id,name,age));
				}
				
			}
			cursor.close();
			db.close();
			return personList;
		}
		
		return null;
	}
}
通过api方式操作数据库
package com.heima.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.heima.entites.Person;
import com.heima.sqlitedemo.db.personSQLITEOpenHelper;

public class PersonDao2 {
	private personSQLITEOpenHelper mOpenHelper;

	public PersonDao2(Context context){
		mOpenHelper = new personSQLITEOpenHelper(context);
	}
	
	//添加person数据  
	public void insert(Person person){
		//获取只写的数据库
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		//判断数据库是否打开
		if(db.isOpen()){//如果打开就执行添加的操作
			
			ContentValues values = new ContentValues();
			values.put("name", person.getName());
			values.put("age", person.getAge());
			//id是影响行   也就是插在那一行的那个主键
			//第二参数是当values为空的时候用来说明那个列的字段是null
			//db.insert("person","name",null);
			long id = db.insert("person", null, values);
			Log.i("insert", id+"");
			
			db.close();
		}
	}
	
	public void delete(int id){
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		if(db.isOpen()){
			String whereClause = "id = ?";  //把where等关键字都去掉就是了
			String[] whereArgs = {id+""};
			int count = db.delete("person", whereClause, whereArgs);
			Log.i("delete", count+"");
			db.close();
		}
	}
	
	public void update(int id,String name){
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		if(db.isOpen()){
			ContentValues values = new ContentValues();
			values.put("name", name);
			String whereClause = "id = ?";
			String[] whereArgs = {id+""};//一定要String类型?
			int count = db.update("person", values, whereClause, whereArgs);
			Log.i("update", count+"");
			db.close();
		}
	}
	
	public List<Person> queryAll(){
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		if(db.isOpen()){
			
			//罗列出要选出的字段
			String[] columns = {"_id","name","age"};
			String selection = null;  //选择查询条件   null为查询所有
			String[] selectionArgs = null; //选择条件参数  替代?的值
			String groupBy = null; //分组语句   group by name
			String having = null; //过滤语句
			String orderBy = null; //排序语句
			Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
			List<Person> personList = new ArrayList<Person>();
			Person person = null;
			if(cursor!=null && cursor.getCount()>0){
				int id;
				String name;
				int age;
				while(cursor.moveToNext()){
					id = cursor.getInt(0);
					name = cursor.getString(1);
					age = cursor.getInt(2);
					person = new Person(id,name,age);
					personList.add(person);
				}
			}
			//cursor用完之后一定要close,这是结果集,如果没关闭会一直存在,时间久了就是内存溢出
			cursor.close();
			db.close();
			return personList;
			
		}
		
		return null;
	}
	
}
model类
package com.heima.entites;

public class Person {

	private int id;
	private String name;
	private int age;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
}

通过test测试数据库是否创建成功

    需要配置清单加上配置

testTransaction测试事务回滚

package com.heima.test;

import java.util.List;

import com.heima.dao.PersonDao;
import com.heima.dao.PersonDao2;
import com.heima.entites.Person;
import com.heima.sqlitedemo.db.personSQLITEOpenHelper;

import android.database.sqlite.SQLiteDatabase;
import android.provider.OpenableColumns;
import android.test.AndroidTestCase;
import android.util.Log;

public class test extends AndroidTestCase {

	public void test(){
		//什么时候创建
		personSQLITEOpenHelper openHelper = new personSQLITEOpenHelper(getContext());//android提供的上下文
		//这里开始创建数据库     在data/data下多了一个database的文件夹     onCreate会被调用
		openHelper.getReadableDatabase();  
	}
	
	public void testInsert(){
		PersonDao dao = new PersonDao(getContext());
		dao.insert(new Person(0,"zhangsan",23));
		dao.insert(new Person(0,"lisi",23));
		dao.insert(new Person(0,"wangwu",23));
	}
	public void testGetAll(){
		PersonDao dao = new PersonDao(getContext());
		
		List<Person> personList = dao.getAll();
		
		for(Person person : personList){
			Log.i("test", person.getName());
		}
	}
	public void testQueryAll(){
		PersonDao2 dao = new PersonDao2(getContext());
		List<Person> personList = dao.queryAll();
		for(Person person : personList){
			Log.i("test", person.getName());
		}
	}
	
	public void testTransaction(){
		personSQLITEOpenHelper openHelper = new personSQLITEOpenHelper(getContext());
		SQLiteDatabase db = openHelper.getWritableDatabase();
		if(db.isOpen()){
			try {
				//开始事务
				db.beginTransaction();
				db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");
				db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");
				db.close();
				//标记事务成功    可以写多次,相当于回滚点
				db.setTransactionSuccessful();
			} catch (Exception e) {
				// TODO: handle exception
				//停止事务
				db.endTransaction();
				//不需要回滚,因为如果没有执行到事务成功的标志,那么就会自动回滚
			}
		}
	}
}

© 著作权归作者所有

上一篇: 视频播放
下一篇: 多线程断点下载
chenruibing
粉丝 12
博文 203
码字总数 109101
作品 0
潮州
私信 提问
Android 中万能的 BaseAdapter(Spinner,ListView,GridView) 的使用!

大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的。而(Spinner,ListView,GridView)都有自己的适配器(记起来...

阿酷
2011/11/07
5.8K
3
Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!

大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的。而(Spinner,ListView,GridView)都有自己的适配器(记起来...

迷途d书童
2012/02/29
3K
1
android--------listview之适配器

ListView之适配器的使用,包含了ArrayAdapter,SimpleAdapter ,BaseAdapter等适配器。 1:ArrayAdapter 预览效果: 2:SimpleAdapter 使用simpleAdapter的数据用一般都是HashMap构成的List,...

切切歆语
2016/11/23
10
0
Android之Adapter用法总结

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter...

蜗牛TT
2012/06/12
1K
0
android之ListView和BaseAdapter的组合使用

BaseAdapter是基本适配器,功能强大,凡是能用ArrayAdapter和SimpleAdapter解决的,都可以使用BaseAdapter解决。 BaseAdapter是一个抽象类,所以需要自定义一个类来继承BaseAdapter。BaseAda...

墨宇hz
2015/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DevOps是如何实现效率的提升?

随着企业业务对软件系统日益依赖,IT管理与研发模式也随之对“敏态”模式产生了需求,也就是今天时常提起的DevOps。提升效率,是DevOps实践的核心内容之一。就让我们来一起从软件生命周期的业...

嘉为科技
25分钟前
2
0
总结:linux目录之proc

我们系统大部分的基础数据采集,其实就是读取proc目录下的文件,并解析获取数据的过程。 1、如cpu利用率:直接cat /proc/cpuinfo命令,然后获取输出内容,并解析里面的数据,如cpu核数等; ...

浮躁的码农
26分钟前
2
0
比原Bapp红包应用

喜迎国庆期间,比原链在自己的移动端钱包Bycoin(下载地址)和google插件钱byone中推出了红包应用,在国庆期间深受大家好评。 那我们今天就来大概介绍一下比原红包,以及基于比原链开发dapp应用...

比原链Bytom
28分钟前
2
0
Linux中没有rc.local文件的解决方法

Linux中没有rc.local文件的解决方法是什么呢?这应该是很多工程师比较头疼的问题,下面就给大家例举几个解决办法。 比较新的Linux发行版已经没有rc.local文件了。因为已经将其服务化了。 解决...

xiangyunyan
28分钟前
2
0
数据中台在阿里巴巴集团内部的实践情况

作者:品鉴 数据中台门在阿里巴巴集团干什么的,由哪个部门掌管?数据中台在阿里巴巴的主要作用是什么呢?外面吹嘘这么神秘的数据中台在阿里实践的如何呢?今天小编正好要采访数据技术及产品...

阿里云官方博客
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部