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>