android数据库操作.docx

上传人:b****7 文档编号:9729314 上传时间:2023-02-06 格式:DOCX 页数:15 大小:19.49KB
下载 相关 举报
android数据库操作.docx_第1页
第1页 / 共15页
android数据库操作.docx_第2页
第2页 / 共15页
android数据库操作.docx_第3页
第3页 / 共15页
android数据库操作.docx_第4页
第4页 / 共15页
android数据库操作.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

android数据库操作.docx

《android数据库操作.docx》由会员分享,可在线阅读,更多相关《android数据库操作.docx(15页珍藏版)》请在冰豆网上搜索。

android数据库操作.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1