Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!
大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~
Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。
文件存储我就不用多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android高手进阶教程(七)之----Android 中Preferences的使用!
今天我们将讲一下SQLiteDatabase的使用。而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石。
为了让大家更好的掌握,我们手把手完成该节的Demo。
第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.
第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:
- packagecom.android.tutor;
- importandroid.content.ContentValues;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- publicclassBooksDBextendsSQLiteOpenHelper{
- privatefinalstaticStringDATABASE_NAME="BOOKS.db";
- privatefinalstaticintDATABASE_VERSION=1;
- privatefinalstaticStringTABLE_NAME="books_table";
- publicfinalstaticStringBOOK_ID="book_id";
- publicfinalstaticStringBOOK_NAME="book_name";
- publicfinalstaticStringBOOK_AUTHOR="book_author";
- publicBooksDB(Contextcontext){
- //TODOAuto-generatedconstructorstub
- super(context,DATABASE_NAME,null,DATABASE_VERSION);
- }
- //创建table
- @Override
- publicvoidonCreate(SQLiteDatabasedb){
- Stringsql="CREATETABLE"+TABLE_NAME+"("+BOOK_ID
- +"INTEGERprimarykeyautoincrement,"+BOOK_NAME+"text,"+BOOK_AUTHOR+"text);";
- db.execSQL(sql);
- }
- @Override
- publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- Stringsql="DROPTABLEIFEXISTS"+TABLE_NAME;
- db.execSQL(sql);
- onCreate(db);
- }
- publicCursorselect(){
- SQLiteDatabasedb=this.getReadableDatabase();
- Cursorcursor=db
- .query(TABLE_NAME,null,null,null,null,null,null);
- returncursor;
- }
- //增加操作
- publiclonginsert(Stringbookname,Stringauthor)
- {
- SQLiteDatabasedb=this.getWritableDatabase();
- /*ContentValues*/
- ContentValuescv=newContentValues();
- cv.put(BOOK_NAME,bookname);
- cv.put(BOOK_AUTHOR,author);
- longrow=db.insert(TABLE_NAME,null,cv);
- returnrow;
- }
- //删除操作
- publicvoiddelete(intid)
- {
- SQLiteDatabasedb=this.getWritableDatabase();
- Stringwhere=BOOK_ID+"=?";
- String[]whereValue={Integer.toString(id)};
- db.delete(TABLE_NAME,where,whereValue);
- }
- //修改操作
- publicvoidupdate(intid,Stringbookname,Stringauthor)
- {
- SQLiteDatabasedb=this.getWritableDatabase();
- Stringwhere=BOOK_ID+"=?";
- String[]whereValue={Integer.toString(id)};
- ContentValuescv=newContentValues();
- cv.put(BOOK_NAME,bookname);
- cv.put(BOOK_AUTHOR,author);
- db.update(TABLE_NAME,cv,where,whereValue);
- }
- }
第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <EditText
- android:id="@+id/bookname"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- </EditText>
- <EditText
- android:id="@+id/author"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- </EditText>
- <ListView
- android:id="@+id/bookslist"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- </ListView>
- </LinearLayout>
第四步:修改SQLiteDatabaseDemo.java代码如下:
- packagecom.android.tutor;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.os.Bundle;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.AdapterView;
- importandroid.widget.BaseAdapter;
- importandroid.widget.EditText;
- importandroid.widget.ListView;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassSQLiteDatabaseDemoextendsActivityimplementsAdapterView.OnItemClickListener{
- privateBooksDBmBooksDB;
- privateCursormCursor;
- privateEditTextBookName;
- privateEditTextBookAuthor;
- privateListViewBooksList;
- privateintBOOK_ID=0;
- protectedfinalstaticintMENU_ADD=Menu.FIRST;
- protectedfinalstaticintMENU_DELETE=Menu.FIRST+1;
- protectedfinalstaticintMENU_UPDATE=Menu.FIRST+2;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setUpViews();
- }
- publicvoidsetUpViews(){
- mBooksDB=newBooksDB(this);
- mCursor=mBooksDB.select();
- BookName=(EditText)findViewById(R.id.bookname);
- BookAuthor=(EditText)findViewById(R.id.author);
- BooksList=(ListView)findViewById(R.id.bookslist);
- BooksList.setAdapter(newBooksListAdapter(this,mCursor));
- BooksList.setOnItemClickListener(this);
- }
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- super.onCreateOptionsMenu(menu);
- menu.add(Menu.NONE,MENU_ADD,0,"ADD");
- menu.add(Menu.NONE,MENU_DELETE,0,"DELETE");
- menu.add(Menu.NONE,MENU_DELETE,0,"UPDATE");
- returntrue;
- }
- publicbooleanonOptionsItemSelected(MenuItemitem)
- {
- super.onOptionsItemSelected(item);
- switch(item.getItemId())
- {
- caseMENU_ADD:
- add();
- break;
- caseMENU_DELETE:
- delete();
- break;
- caseMENU_UPDATE:
- update();
- break;
- }
- returntrue;
- }
- publicvoidadd(){
- Stringbookname=BookName.getText().toString();
- Stringauthor=BookAuthor.getText().toString();
- //书名和作者都不能为空,或者退出
- if(bookname.equals("")||author.equals("")){
- return;
- }
- mBooksDB.insert(bookname,author);
- mCursor.requery();
- BooksList.invalidateViews();
- BookName.setText("");
- BookAuthor.setText("");
- Toast.makeText(this,"AddSuccessed!",Toast.LENGTH_SHORT).show();
- }
- publicvoiddelete(){
- if(BOOK_ID==0){
- return;
- }
- mBooksDB.delete(BOOK_ID);
- mCursor.requery();
- BooksList.invalidateViews();
- BookName.setText("");
- BookAuthor.setText("");
- Toast.makeText(this,"DeleteSuccessed!",Toast.LENGTH_SHORT).show();
- }
- publicvoidupdate(){
- Stringbookname=BookName.getText().toString();
- Stringauthor=BookAuthor.getText().toString();
- //书名和作者都不能为空,或者退出
- if(bookname.equals("")||author.equals("")){
- return;
- }
- mBooksDB.update(BOOK_ID,bookname,author);
- mCursor.requery();
- BooksList.invalidateViews();
- BookName.setText("");
- BookAuthor.setText("");
- Toast.makeText(this,"UpdateSuccessed!",Toast.LENGTH_SHORT).show();
- }
- @Override
- publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){
- mCursor.moveToPosition(position);
- BOOK_ID=mCursor.getInt(0);
- BookName.setText(mCursor.getString(1));
- BookAuthor.setText(mCursor.getString(2));
- }
- publicclassBooksListAdapterextendsBaseAdapter{
- privateContextmContext;
- privateCursormCursor;
- publicBooksListAdapter(Contextcontext,Cursorcursor){
- mContext=context;
- mCursor=cursor;
- }
- @Override
- publicintgetCount(){
- returnmCursor.getCount();
- }
- @Override
- publicObjectgetItem(intposition){
- returnnull;
- }
- @Override
- publiclonggetItemId(intposition){
- return0;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- TextViewmTextView=newTextView(mContext);
- mCursor.moveToPosition(position);
- mTextView.setText(mCursor.getString(1)+"___"+mCursor.getString(2));
- returnmTextView;
- }
- }
- }
第五步:运行程序效果如下:
第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。
另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:
由于代码都是现写,时间原因,没有全部加注释,如果大家 有什么不懂的地方,可以留言,我会尽快答复,如果需源代码,请留下你的Email
地址,ok,今天就到这里,大家晚安!