SQLiteDatabaseTest

package com.hyz;

import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class SQLiteDatabaseTest extends Activity implements OnItemClickListener
{	
	private Cursor cursor;
	private EditText BookName;
	private EditText Author;
	private ListView bookslist;
	private int BOOK_ID = 0;
	protected final static int MENU_ADD=Menu.FIRST;
	protected final static int MENU_DELETE=Menu.FIRST+1;
	protected final static int MENU_UPDATE=Menu.FIRST+2;
	protected final static int MENU_QUERY=Menu.FIRST+3;
	private String bookname;
	private String author;
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
       
		Log.w("db", "SQLiteDatabaseTest-->onCreate()");
        setContentView(R.layout.main);
        
    	BookName = (EditText)findViewById(R.id.bookname);
    	Author = (EditText)findViewById(R.id.author);
    	bookslist = (ListView)findViewById(R.id.bookslist);
    	
    	queryAll();
    }   
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
	{
		Log.w("db", "SQLiteDatabaseTest-->onItemClick()");
		cursor.moveToPosition(position);//移至第position行
		BOOK_ID = cursor.getInt(0);//得到第0列
		BookName.setText(cursor.getString(1));//得到第1列
		Author.setText(cursor.getString(2));//得到第2列
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		super.onCreateOptionsMenu(menu);
		Log.w("db", "SQLiteDatabaseTest-->onCreateOptionsMenu()");
		menu.add(Menu.NONE, MENU_ADD, 0, "ADD");
		menu.add(Menu.NONE,MENU_DELETE,0,"DELETE");
		menu.add(Menu.NONE, MENU_UPDATE, 0, "UPDATE");
		menu.add(Menu.NONE, MENU_QUERY, 0, "QUERY");	
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		super.onOptionsItemSelected(item);
		Log.w("db", "SQLiteDatabaseTest-->onOptionsItemSelected()");
		switch(item.getItemId())
		{
		case MENU_ADD:add();break;
		case MENU_DELETE:delete();break;
		case MENU_UPDATE:update();break;
		case MENU_QUERY:query();break;
		}
		return true;
	}

	
	 //初始化视图界面,将全部数据列出来
    public void queryAll()
    {
    	Log.w("db", "SQLiteDatabaseTest-->queryAll()");    	
    	cursor = getContentResolver().query(BooksDB.CONTENT_URI, null, null, null, null);
      	bookslist.setAdapter(new BookListAdapter(this,cursor));
    	bookslist.setOnItemClickListener(this);
    }
    //按姓名或作者关键字查询单个记录
    public void query()
    {
    	Log.w("db", "SQLiteDatabaseTest-->query()");  
		bookname = BookName.getText().toString();
		author = Author.getText().toString();
		if(bookname.equals("")&&author.equals(""))
		{
			queryAll();
		}	
		else
			{
				cursor = getContentResolver().query(BooksDB.CONTENT_URI, null, BooksDB.BOOK_NAME + "=? or " +  BooksDB.BOOK_AUTHOR + "=?", new String[]{bookname , author}, null);
				bookslist.setAdapter(new BookListAdapter(this,cursor));
				bookslist.setOnItemClickListener(this);
			}
		BookName.setText("");
		Author.setText("");
		Toast.makeText(this, "查找成功", Toast.LENGTH_LONG).show();
    	
    }
	private void add()
	{
		Log.w("db", "SQLiteDatabaseTest-->add()");
		bookname = BookName.getText().toString();
		author = Author.getText().toString();
		if(bookname.equals("")||author.equals(""))
		{
			return;
		}
		
		ContentValues values = new ContentValues(2);
		values.put(BooksDB.BOOK_NAME, bookname);
		values.put(BooksDB.BOOK_AUTHOR, author);
		
		getContentResolver().insert(BooksDB.CONTENT_URI, values);
		//下面几句可以在更改的同时更新list
		//Log.w("db", ""+cursor.getPosition());cursor.getPosition()=插入数据位置-1
		//cursor.moveToFirst();移至第一条记录,cursor.getPosition()=0	
		cursor.requery();
		//Log.w("db", ""+cursor.getPosition());cursor.getPosition()=-1	
		//cursor.requery();和bookslist.invalidateViews();需要一起使用
		bookslist.invalidateViews();
		BookName.setText("");
		Author.setText("");
		Toast.makeText(this,"添加成功", Toast.LENGTH_LONG).show();
	}
	private void delete()
	{
		Log.w("db", "SQLiteDatabaseTest-->delete()");
		if(BOOK_ID==0)
		{
			return;
		}
		getContentResolver().delete(ContentUris.withAppendedId(BooksDB.CONTENT_URI, BOOK_ID), null, null);		
		
		cursor.requery();
		bookslist.invalidateViews();
		BookName.setText("");
		Author.setText("");
		Toast.makeText(this,"删除成功", Toast.LENGTH_LONG).show();
	}
	private void update()
	{
		Log.w("db", "SQLiteDatabaseTest-->update()");
		bookname = BookName.getText().toString();
		author = Author.getText().toString();
		
		ContentValues values = new ContentValues();
		values.put(BooksDB.BOOK_NAME, bookname);
		values.put(BooksDB.BOOK_AUTHOR, author);
		if(bookname.equals("")||author.equals(""))
		{
			return;
		}		
		getContentResolver().update(ContentUris.withAppendedId(BooksDB.CONTENT_URI, BOOK_ID), values, null, null);
		
		cursor.requery();
		bookslist.invalidateViews();//及时更新ListView里的内容,否则点击更新   内容不会变,其实内容在数据库中已经变了
		BookName.setText("");
		Author.setText("");
		Toast.makeText(this, "更新成功", Toast.LENGTH_LONG).show();
	}
	public class BookListAdapter extends BaseAdapter
	{
		private Context mContext;
		private Cursor mCursor;
		public BookListAdapter(Context context, Cursor cursor) 
		{
			Log.w("db", "SQLiteDatabaseTest-->BookListAdapter-->BookListAdapter()");
			mContext = context;
			mCursor = cursor;
		}
		@Override
		public int getCount() 
		{
			Log.w("db", "SQLiteDatabaseTest-->BookListAdapter-->getCount()");
			Log.w("db", ""+mCursor.getCount());
			return mCursor.getCount();
		}
		@Override
		public Object getItem(int position)
		{
			Log.w("db", "SQLiteDatabaseTest-->BookListAdapter-->getItem()");
			// TODO Auto-generated method stub
			return null;
		}
		@Override
		public long getItemId(int position)
		{
			// TODO Auto-generated method stub
			Log.w("db", "SQLiteDatabaseTest-->BookListAdapter-->getItemId()");
			return 0;	
		}
		//position表示将显示的是第几行,covertView是从布局文 件中inflate来的布局。
		@Override
		public View getView(int position, View convertView, ViewGroup parent) 
		{
			Log.w("db", "SQLiteDatabaseTest-->BookListAdapter-->getView()");
			TextView mTextView = new TextView(mContext);
			mCursor.moveToPosition(position);
			mTextView.setText(mCursor.getString(1)+"____"+mCursor.getString(2));
			return mTextView;
		}		
	}
}

package com.hyz;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.util.Log;

public class MyProvider extends ContentProvider
{

	private BooksDB mbooksDB;
	private static final UriMatcher sMatcher;	
	private static final int BOOKS = 1;
	private static final int BOOKS_ID = 2;
	// 传入匹配码如果大于0表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径
	// addURI()方法是用来增加其他URI匹配路径的:
	// 第一个参数代表传入标识ContentProvider的AUTHORITY字符串
	// 第二个参数是要匹配的路径,#代表任意数字,另外还可以用*来匹配任意文本
	// 第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码
	static 
	{	
		sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sMatcher.addURI("com.hyz", "books", BOOKS);
		sMatcher.addURI("com.hyz", "books/#", BOOKS_ID);
	}
	/*
	 * 每当ContentProvider启动时都会回调onCreate()方法。
	 * 此方法主要执行一些ContentProvider初始化 的工作,返回true表示初始化成功,返回false则初始化失败。
	 */
	@Override
	public boolean onCreate() 
	{
		Log.w("db", "MyProvider-->onCreate()");	
		//项目首先调用此函数用来创建数据库
		mbooksDB = new BooksDB(getContext());
		return true;
	}	
	/*
	 * * 该方法用于返回当前Url所代表数据的MIME类型 
	 * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头 
	 * 例如:要得到所有person记录的Uri为content://org.wp.provider.personprovider/person 
	 * 那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person" 
	 * 如果要操作的数据属于单一数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头 
	 * 例如:得到id为10的person记录,Uri为content://org.wp.provider.personprovider/person/10 
	 * 那么返回的MIME类型字符串应该为:"vnd.android.cursor.item/person"
	 * 
	 */
	@Override
	public String getType(Uri uri) 
	{
		Log.w("db", "MyProvider-->getType()");	
		switch (sMatcher.match(uri))
		{
			case 1:
				return "vnd.android.cursor.dir/books";
			case 2:
				return "vnd.android.cursor.item/books";
			default:
				throw new IllegalArgumentException("Unknown URI " + uri);
		}
	}
	/*
	 * 用于数据的删除,返回的是所影响数据的数目,首先利用数据库辅助对象获取一个SQLiteDatabase对象
	 * 然后根据传入Uri用sMatcher进行匹配,对单个数据或数据集进行删除或修改。notifyChange()方法
	 * 用来通知注册在次URI上的观察者(observer)数据发生了改变。
	 * */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) 
	{
		Log.w("db", "MyProvider-->delete()");		
		SQLiteDatabase db = mbooksDB.getWritableDatabase();		
		int count;
		switch(sMatcher.match(uri))
		{
		case BOOKS:  count = db.delete(BooksDB.TABLE_NAME, selection, selectionArgs);
			break;
		case BOOKS_ID: count = db.delete(BooksDB.TABLE_NAME, BooksDB.BOOK_ID + "=?", new String[]{ContentUris.parseId(uri)+""});
			break;
        default:     
            throw new UnsupportedOperationException("Cannot update URL: ");  	
		}
	    return count;	
	}
	@Override
	public Uri insert(Uri uri, ContentValues values) 
	{
		Log.w("db", "MyProvider-->insert()");	
   	 	//插入操作要对所有的字段插入,如果带有参数,则报异常
        if (sMatcher.match(uri) != BOOKS)
        {
            throw new IllegalArgumentException("Cannot insert into URL: " + uri);
        }
        SQLiteDatabase db = mbooksDB.getWritableDatabase();
        long rowId = db.insert(BooksDB.TABLE_NAME, null, values);
        return ContentUris.withAppendedId(BooksDB.CONTENT_URI, rowId);
      
	}
	
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,	String[] selectionArgs, String sortOrder) 
	{			
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        int match = sMatcher.match(uri);
        switch (match) 
        {
        	//1 、直接查询表中的所有数据
            case BOOKS:
            	Log.w("db", "MyProvider-->query(1)");	
                qb.setTables("books_table");
                break;
            //2 、根据ID查询
            case BOOKS_ID:  
            	Log.w("db", "MyProvider-->query(2)");	
                qb.setTables(BooksDB.TABLE_NAME);
                qb.appendWhere("book_id=");
                //拿到uri后面的第一个参数并将它赋给数据库字段"_id";
                qb.appendWhere(uri.getPathSegments().get(1));
                break;
            default:
                throw new IllegalArgumentException("Unknown URL " + uri);
        }
        //3 、根据指定条件查询数据并返回cursor
        SQLiteDatabase db = mbooksDB.getReadableDatabase();
        Cursor ret = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);
        return ret;
	}
	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 
	{
		Log.w("db", "MyProvider-->update()");		
		SQLiteDatabase db = mbooksDB.getWritableDatabase();
		int count ;     
		
		switch(sMatcher.match(uri))
		{
		case BOOKS:  count = db.update(BooksDB.TABLE_NAME, values, selection , selectionArgs);
			break;
		case BOOKS_ID: count = db.update(BooksDB.TABLE_NAME, values , BooksDB.BOOK_ID + "=?",new String[]{ uri.getPathSegments().get(1)});
			break;			       
        default:     
            throw new UnsupportedOperationException("Cannot update URL: ");     
		}
        return count;
     }		
}
package com.hyz;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;
public class BooksDB extends SQLiteOpenHelper 
{
	private final static String DATABASE_NAME = "books.db";
	private final static int DATABASE_VERSION = 1;
	public final static String TABLE_NAME = "books_table";
	public final static String BOOK_ID = "book_id";
	public final static String BOOK_NAME = "book_name";
	public final static String BOOK_AUTHOR = "book_author";
	public static final Uri CONTENT_URI = Uri.parse("content://com.hyz/books");
	
	public BooksDB(Context context) 
	{
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		Log.w("db", "BooksDB-->BooksDB()");
	}
	/** 
	 * 如果数据库文件不存在,只有oncreate()被调用(该方法在创建数据库时被调用一次)。
	 * 如果数据库文件存在,会调用onupdate()方法升级数据库,并更新版本号。
	 */
	@Override
	public void onCreate(SQLiteDatabase db) 
	{
		Log.w("db", "BooksDB-->onCreate()");
		String sql = "create table "+TABLE_NAME+" ("+BOOK_ID+" INTEGER primary key autoincrement, "+BOOK_NAME+" text,"+BOOK_AUTHOR+" text);";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
	{
		Log.w("db", "BooksDB-->onUpgrade()");
		String sql = "drop table if exists" + TABLE_NAME;
		db.execSQL(sql);
		onCreate(db);
	}	
}


main.xml
 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="书名"
    />
    <EditText 
    	android:id="@+id/bookname" 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"/>
	<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="作者"
    />
    <EditText 
    	android:id="@+id/author" 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"/>    	
     <ListView 
    	android:id="@+id/bookslist" 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"/>   	
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.hyz"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SQLiteDatabaseTest"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>        
        <provider android:name="MyProvider" android:authorities="com.hyz" />        
    </application>
</manifest> 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值