android数据库操作.docx
《android数据库操作.docx》由会员分享,可在线阅读,更多相关《android数据库操作.docx(15页珍藏版)》请在冰豆网上搜索。
android数据库操作
SQLiteDatabase
这个是在android中数据库操作使用最频繁的一个类。
通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
重要方法介绍:
(1)publicstatic SQLiteDatabase openOrCreateDatabase (
File file, SQLiteDatabase.CursorFactory factory)
publicstatic SQLiteDatabase openOrCreateDatabase (
String path, SQLiteDatabase.CursorFactory factory)
这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.
CursorFactory则是一个产生Cursor对象的工厂类(Cursor接口将在后面介绍到)。
(2)public long insert (String table, String nullColumnHack, ContentValues values)
看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。
ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。
(3)public int delete (String table, String whereClause, String[] whereArgs)
不用说了,用于删除表中的数据。
(4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
名字很长是吧,它的功能也很强大,用于查询数据库中的数据。
(5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
用于修改数据。
根据传入参数的名字可以对使用方法略知一二。
(6)public void execSQL (String sql, Object[] bindArgs)
public void execSQL (String sql)
这是我个人认为最为重要的方法。
这个方法用于执行你用String表示的非查询(因为它不会返回一个Cursor对象)的sql语句,例如CREATE,SELECT等。
遗憾的是现在尚无法一次调用该方法来执行用“;”分开的多条sql语句。
第二个重写方法使用的更多些。
(7)public void close ()
用来关闭数据库并释放数据库占用的相关资源。
SQLiteOpenHelper
正如它的名字所表述的一样,这个抽象类是一个辅助类(Helper),用来打开(若数据库已存在)或创建数据库的。
关于抽象类我们都知道,如果要使用它,一定是继承它。
所以使用它都是通过自己定义一个类继承于它,并实现onCreate(SQLiteDatabase) , onUpgrade(SQLiteDatabase,int,int) , onOpen(SQLiteDatabase)三个方法。
在我看来,所谓的辅助类,其实就是充当了一个封装器——也就是说用于对其辅助的类实现一个java上的封装。
在这里,SQLiteOpenHelper就是用来对SQLiteDatabase进行一个封装处理。
初学的同学想要进一步理解的话可以先看看什么是封装。
它包含的方法如下:
(1)synchronized voidclose()
关闭任何已开启的数据库对象。
(2)synchronized SQLiteDatabasegetReadableDatabase()
创建或打开一个仅仅可读的(read-only)数据库。
(3)synchronized SQLiteDatabasegetWritableDatabase()
创建或打开一个可读可写的数据库。
(4)abstract voidonCreate(SQLiteDatabase db)
当数据库被第一次创建时被调用的的方法(类似于Activity的onCreate())。
(5)voidonOpen(SQLiteDatabase db)
数据库已经被成打开后被调用。
(6)abstract voidonUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
当数据库需要被更改(更新)时被调用。
Cursor
Cursor没有构造方法,只能通过query方法获得。
前面提到了,execSQL方法无法执行与查询相关的sql语句,是因为无法返回一个Cursor对象——查询需要将查到的结果(就是表中的哪一行满足查询条件)返回,execSQL是返回void的,所以无法操作查询语句。
从这里可以了解到,Cursor接口从某种意义上说就是为了弥补这一点的——query方法就是返回了一个Cursor对象。
从名字上看,它的意思是游标,所以大概可以猜到他起到了一个指代的作用(事实上就是的,它指代数据库中保存数据的表的一行,并且还可以简单的处理该行数据项的信息)。
从类的描述看,Cursor提供了对一个数据库查询动作返回结果束的随机读写途径,也就是说,它是一个对查询操作返回结果进行进一步处理的类,而这些处理就是用Cursor里的方法实现的。
结合SimpleCursorAdapter这个适配器类,你可以很方便的将数据库中的数据显示到AdapterView(例如ListView,GridView)中——这也是Cursor的另一大用处。
如果你了解java中的迭代器(Iterator)的话你就会发现其实Cursor和迭代器有些相似,这样你可能会更快的了解Cursor。
一些常用的方法有:
(1)publicabstract boolean moveToPosition (int position)
publicabstract boolean moveToFirst ()
publicabstract boolean moveToLast ()
publicabstract boolean moveToNext ()
publicabstract boolean moveToPrevious ()
把这些方法放在一起的目的很明显:
它们都是对Cursor指向的位置进行操作的方法——移到某个指定的位置、移到第一行、移到最后一行、移向下一行、移向上一行等等。
(2)publicabstract int getCount ()
返回Cursor指向的表含有的总数据项数。
(3)publicabstract boolean requery ()
Cursor是被一个query方法产生的,而这个方法就是将那个query方法所做的查询动作再执行一遍——这将会改变调用该方法的Cursor对象的值,也就是说,Cursor使用了该方法后就复位了。
(4)publicabstract boolean isClosed ()
publicabstract boolean isFirst ()
publicabstract boolean isLast ()
publicabstract boolean isNull (int columnIndex)
publicabstract boolean isClosed ()
publicabstract boolean isAfterLast ()
publicabstract boolean isBeforeFirst ()
在java中,类似于isWhatever形式的方法大都是对对象状态进行判断的方法——Whatever成立则返回true,不成立则返回false。
这些方法也不例外。
值得提一下的是isNull方法,该方法测试某个栏位所保存的信息是否为NULL。
参数columnIndex代表了那个栏位的代号。
④另外建议各位了解一下SimpleCursorAdapter
第一步:
新建一个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"?
>
android="
android:
orientation="vertical"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
>
android:
id="@+id/bookname"
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
>
android:
id="@+id/author"
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
>
android:
id="@+id/bookslist"
android:
layout_width="fill_parent"
android:
layout_height="wrap_content"
>
第四步:
修改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();
B