Android学习篇章36-ContentProvider

MainActivity:

public class MainActivity extends Activity {
	EditText  bookIdTxt=null;
	EditText  bookTxt=null;
	EditText  authorTxt=null;
	EditText  priceTxt=null;
	BookDao  db=null;
	ListView  listview1=null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}
	@Override
	protected void onPause() {
		if(db!=null)
			db.closeDB();
		super.onPause();
	}

	@Override
	protected void onResume() {
		db=new BookDao(this);
		super.onResume();
	}

	@Override
	protected void onStop() {
		//关闭数据库
		db.closeDB();
		super.onStop();
	}

	public  void  clickBtn(View view)
	{
		  int id=view.getId();
		  if(id==R.id.btn1)
		  {
			  //增加图书信息
			  addBook();
		  }else if(id==R.id.btn2)
		  {
			  delBookById();
			  findAllBook3();
		  }else if(id==R.id.btn3)
		  {
			  updateBookById();
		  }else if(id==R.id.btn4)
		  {
			  findBookById();
		  }else if(id==R.id.btn5)
		  {
			  //findAllBookByCursor();
			  findAllBook3();
		  }
	}
	public void  delBookById()
	{
		String bookId=""+bookIdTxt.getText();
		db.delBookById(bookId);
	}
	public void findAllBookByCursor()
	{
	}
	public void findAllBook()
	{
		List<Book> bookList= db.queryAllBooks();
		
		List  list=new ArrayList<String>();
		for(int i=0;i<bookList.size();i++)
		{
			list.add(""+bookList.get(i));
		}
		ArrayAdapter<String>  adapter=
				new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
		listview1.setAdapter(adapter);
	}
	
	
	public void findAllBook2()
	{
		List<Book> bookList= db.queryAllBooks();
		mybookadapter adapter=(mybookadapter)listview1.getAdapter();
        if(adapter==null)
        {
		  adapter=new mybookadapter(this);
		  listview1.setAdapter(adapter);
        }
		adapter.setData(bookList);
		//要通知数据集发生变动
		adapter.notifyDataSetChanged();
	}	
	
	public void findAllBook3()
	{
		List<Book> bookList= db.queryAllBooks();
		List<Map<String, Object>> mapList=new ArrayList<Map<String,Object>>();
		for(Book b: bookList)
		{
			Map m=new HashMap<String, Object>();
			m.put("bookid", b.bookId);
			m.put("bookname", b.bookname);
			m.put("author", b.author);
			m.put("price", b.price);
			mapList.add(m);
		}
		String[] from={"bookid","bookname","author","price"};
		int[] to={R.id.bookIdTxt,R.id.bookTxt,R.id.authorTxt,R.id.priceTxt};
		SimpleAdapter adapter=new SimpleAdapter(this, mapList, R.layout.line, from, to);
		  listview1.setAdapter(adapter);
		//要通知数据集发生变动
		adapter.notifyDataSetChanged();
	}	
	
	public  void findBookById()
	{
	}
	
	public void addBook()
	{
		String name=""+bookTxt.getText();
		String author=""+authorTxt.getText();
		float price=Float.parseFloat(""+priceTxt.getText());
		Book book=new Book();
		book.bookname=name;
		book.author=author;
		book.price=price;
		db.insertBook(book);

	}

	public  void updateBookById()
	{
	}
	
	public class mybookadapter extends  BaseAdapter
	{
		List<Book> list=new ArrayList<Book>();
		LayoutInflater inflater=null;
		Context context;
		public  mybookadapter(Context context)
		{
			this.context=context;
			inflater=LayoutInflater.from(context);
		}
		public void setData(List<Book>  list)
		{
			this.list=list;
		}
		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			Book book=list.get(position);
			if(convertView==null)
			{
				convertView=inflater.inflate(R.layout.line,null);
				CompnentHolder ch=new CompnentHolder();
				ch.idTxt=(TextView)convertView.findViewById(R.id.bookIdTxt);
			    ch.nameTxt=(TextView)convertView.findViewById(R.id.bookTxt);
			    ch.authorTxt=(TextView)convertView.findViewById(R.id.authorTxt);
			    ch.priceTxt=(TextView)convertView.findViewById(R.id.priceTxt);
                convertView.setTag(ch);			    
			}
			
			CompnentHolder ch=(CompnentHolder)convertView.getTag();
			ch.idTxt.setText(""+book.bookId);
			ch.nameTxt.setText(book.bookname);
			ch.authorTxt.setText(book.author);
			ch.priceTxt.setText(""+book.price);
			
			if(position%2==0)
			{
			  convertView.setBackgroundColor(Color.RED);
			  ch.idTxt.setTextColor(Color.WHITE);
			  ch.nameTxt.setTextColor(Color.WHITE);
			  ch.authorTxt.setTextColor(Color.WHITE);
			  ch.priceTxt.setTextColor(Color.WHITE);
			}else
			{
			  convertView.setBackgroundColor(Color.WHITE);
			  ch.idTxt.setTextColor(Color.BLACK);
			  ch.nameTxt.setTextColor(Color.BLACK);
			  ch.authorTxt.setTextColor(Color.BLACK);
			  ch.priceTxt.setTextColor(Color.BLACK);			  
			}
			return convertView;
		}
		
	}
	

	public void init()
	{
		  bookIdTxt=(EditText)findViewById(R.id.bookIdTxt);
		  bookTxt=(EditText)findViewById(R.id.bookTxt);
		  authorTxt=(EditText)findViewById(R.id.authorTxt);
		  priceTxt=(EditText)findViewById(R.id.priceTxt);
		  listview1=(ListView)findViewById(R.id.listview1);
	}
	
	public class   CompnentHolder
	{
		public  TextView idTxt;
		public  TextView nameTxt;
		public  TextView authorTxt;
		public  TextView priceTxt;
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}


ContentProvider:

public class MyBookProvider  extends ContentProvider{

	BookDao bookDao=null;
	//注册Provider的URI地址
	public  static  UriMatcher uriMatcher=null;
	//多条记录的识别码
	public  static final int  BOOKS_CODE=1;
	//单条记录的识别码
	public  static final int  BOOK_CODE=2;
	
	static{
		uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
	//注册多条记录的URI地址
		uriMatcher.addURI(BookMetaData.AUTHORITY, "book", BOOKS_CODE);
    //单条记录的URI地址
		uriMatcher.addURI(BookMetaData.AUTHORITY, "book/#", BOOK_CODE);
	}
	
	@Override
	public boolean onCreate() {
		Log.i("test", "Provider被创建");
		bookDao=new BookDao(this.getContext());
		return true;
	}
	@Override
	public String getType(Uri uri) {
		int code=uriMatcher.match(uri);
		switch(code)
		{
  		  case  BOOKS_CODE  :return  BookMetaData.TblBookinfoMetaData.BOOK_DIR_TYPE;
		  case  BOOK_CODE: return  TblBookinfoMetaData.BOOK_ITEM_TYPE;
		}
		return null;
	}	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		int result=0;
		int code=uriMatcher.match(uri);
		switch(code)
		{
		   case  BOOKS_CODE:
			        //如果delete的是多条记录
			    result=bookDao.delBooks(selection, selectionArgs);
			   this.getContext().getContentResolver().notifyChange(uri, null);
			   return result;
		   case  BOOK_CODE:
			        //如果删除是单条记录  首先要从URI地址中解析出ID号
			   long id=ContentUris.parseId(uri);
			    result=bookDao.delBookById(id);
			    this.getContext().getContentResolver().notifyChange(uri, null);
			   return result;
		   default: throw new IllegalArgumentException("URI地址不合法");
		}
	}
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		return 0;
	}
	//第一个参数是用户在访问ContentProvider时所提交的地址
	@Override
	public Uri insert(Uri uri, ContentValues values) {
        //检查URI地址是否合法
		int code=uriMatcher.match(uri);
		Log.i("test", " insert uri="+uri+" code="+code);
		switch(code)
		{
		    case   BOOKS_CODE:
		    	   long id=   bookDao.insertBook(values);
                  //获得新记录的URI地址
		    	   Uri newUri=Uri.withAppendedPath(Uri.parse(TblBookinfoMetaData.BOOKS_URI), ""+id);
		    	  //通知数据观察者Observer数据库已经发生变更
		    	   this.getContext().getContentResolver().notifyChange(uri, null);
		    	   return newUri; 
		    default: throw new IllegalArgumentException("URI地址不合法");
		}
	}
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		//检查URI地址是否合法
		int code=uriMatcher.match(uri);
		switch(code)
		{
		   case  BOOKS_CODE:
			        //如果查询的是多条记录
			   return bookDao.query(projection, selection, selectionArgs, sortOrder);
		   case  BOOK_CODE: 
			        //如果查询的是单条记录  首先要从URI地址中解析出ID号
			   long id=ContentUris.parseId(uri);
			   return bookDao.queryBookById(id);
		   default: throw new IllegalArgumentException("URI地址不合法");
		}
	}
}

数据类:

//book.db的元数据类
public class BookMetaData {
	public static final  String AUTHORITY="veryedu.cls229.lession12.MyProvider";//ContentProvider的标识
	public static final  String  BOOK_DB="book.db";
	public static final  int   VISION=1;
	public static final  String  TBL_BOOK="bookinfo";
	
	public static class  TblBookinfoMetaData implements  BaseColumns
	{
		//访问多本图书的uri地址 content://veryedu.cls229.lession12.MyProvider/book
		public  static final  String BOOKS_URI="content://"+AUTHORITY+"/book";
		//访问单本图书的uri地址 content://veryedu.cls229.lession12.MyProvider/book/11
		public  static final  String BOOK_URI="content://"+AUTHORITY+"/book/";
		
		//多条数据的数据类型
		public  static final String BOOK_DIR_TYPE="vnd.android.cursor.dir/vnd.mybooks.contenttype";
		//单条数据的数据类型
		public  static final String BOOK_ITEM_TYPE="vnd.android.cursor.item/vnd.mybooks.contenttype";
		
		public  static final  String TBL_BOOK="bookinfo";
        public  static final  String BOOK_NAME="bookname";
        public  static final  String BOOK_AUTHOR="author";
        public  static final  String BOOK_PRICE="price";
		
	}
}

数据库:SQLiteOpenHelper:

public class MySqliteDbHelper extends  SQLiteOpenHelper{
	private static MySqliteDbHelper instance=null;
	//name 数据库名
	//factory游标工厂
	//version版本号
	public MySqliteDbHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}
	public static MySqliteDbHelper getInstance(Context context)
	{
		if(instance==null)
		   instance=new MySqliteDbHelper(context,BookMetaData.BOOK_DB,null,BookMetaData.VISION);
		return instance; 
	}
	//这个方法会在数据库第一次访问时创建
	//一般我们在这个方法中完成建库建表以及加入默认数据的操作
	@Override
	public void onCreate(SQLiteDatabase db) {
		String createBookTab="create table  "+BookMetaData.TBL_BOOK+"(_id integer primary key autoincrement," +
				BookMetaData.TblBookinfoMetaData.BOOK_NAME +","
				+" "+BookMetaData.TblBookinfoMetaData.BOOK_AUTHOR
				+","+BookMetaData.TblBookinfoMetaData.BOOK_PRICE+")";
		db.execSQL(createBookTab);
	}

	//这个方法是在有版本更新   新版本的版本号大于老版本的版本号时执行
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //把原来老的表删除  创建新的数据库		一般来说要先备份老的数据 再重新创建数据库
		db.execSQL("drop table "+BookMetaData.TBL_BOOK);
		onCreate(db);
	}
}

DAO:
public class BookDao {
	
	MySqliteDbHelper  dbhelper=null;
	String db_path="book.db";
	Context context=null;
	public  BookDao(Context context)
	{
		this.context=context;
		dbhelper=MySqliteDbHelper.getInstance(context);
	}
	public  void closeDB()
	{
		if(dbhelper!=null)
		{
			dbhelper.close();
			dbhelper=null;
		}

	}
	public int  updateBook(Book book)
	{
		return 0;
	}
	public  Cursor  queryAllBooksByCursor()
	{
		return null;
		
	}

	public void delBookById(String  bookid)
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		db.delete(BookMetaData.TblBookinfoMetaData.TBL_BOOK, "_id="+bookid, null);
	}
	
	public int delBookById(long bookid)
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		return db.delete(BookMetaData.TblBookinfoMetaData.TBL_BOOK, "_id="+bookid, null);
	}
	
	public  int  delBooks(String whereClause, String[] whereArgs )
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		return db.delete(TblBookinfoMetaData.TBL_BOOK, whereClause, whereArgs);
	}
	
	public  List<Book>  queryAllBooks()
	{
		List<Book>  bookList=new ArrayList<Book>();
        
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		
		Cursor c=db.query(BookMetaData.TblBookinfoMetaData.TBL_BOOK, null, null, null, null, null, null);
	    if(c.moveToFirst())
	    {
	    	do{
	    		Book b=new Book();
	    		b.bookId=c.getInt(c.getColumnIndex("_id"));
	    		b.bookname=c.getString(c.getColumnIndex("bookname"));
	    		b.author=c.getString(c.getColumnIndex("author"));
	    		b.price=c.getFloat(c.getColumnIndex("price"));
	    		bookList.add(b);
	    	}while(c.moveToNext());
	    }
	    c.close();
	    return bookList;
	}
	
	
	public  Cursor   query(String[] projection, String selection,
			String[] selectionArgs, String sortOrder)
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		Cursor cursor=db.query(TblBookinfoMetaData.TBL_BOOK, projection, selection, selectionArgs, null, null, sortOrder);
	    return  cursor;
	}
	
	
	public  Book  queryBookById(String id)
	{
		return null;
	}
	
	public  Cursor  queryBookById(long id)
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		Cursor  c=db.query(TblBookinfoMetaData.TBL_BOOK, null, TblBookinfoMetaData._ID+"="+id, null, null, null, null);
		return c;
	}
	public  void  insertBook(Book book)
	{
		
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		ContentValues values=new ContentValues();
		values.put("bookname", book.bookname);
		values.put("author", book.author);
		values.put("price", book.price);
		db.insert(BookMetaData.TblBookinfoMetaData.TBL_BOOK,"author", values);

	}
	
	public  long  insertBook(ContentValues values)
	{
		SQLiteDatabase db=dbhelper.getWritableDatabase();
		return db.insert(BookMetaData.TblBookinfoMetaData.TBL_BOOK,"author", values);
	}
}
实体类:

public class Book {
	
	public int bookId;
	public String bookname;
	public String author;
	public float  price;
	
	public String toString()
	{
		return  "id:"+bookId+" 书名:"+bookname
				+" 作者:"+author+" 价格:"+price;
	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值