Android提高第八篇之SQLite分页读取
本文来自http://blog.****.net/hellogv/,引用必须注明出处!
Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作。不过有跨平台需求的程序就建议使用标准的SQL语句,毕竟这样容易在多个平台之间移植。
先贴出本文程序运行的结果:
本文主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表、插入数据,关闭数据库,以及使用GridView实现了一个分页栏(关于GridView的用法),用于把数据分页显示。
分页栏的pagebuttons.xml的源码如下:
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"android:paddingBottom="4dip"
- android:layout_width="fill_parent">
- <TextViewandroid:layout_width="wrap_content"
- android:layout_below="@+id/ItemImage"android:layout_height="wrap_content"
- android:text="TextView01"android:layout_centerHorizontal="true"
- android:id="@+id/ItemText">
- </TextView>
- </RelativeLayout>
main.xml的源码如下:
- <?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">
- <Buttonandroid:layout_height="wrap_content"
- android:layout_width="fill_parent"android:id="@+id/btnCreateDB"
- android:text="创建数据库"></Button>
- <Buttonandroid:layout_height="wrap_content"
- android:layout_width="fill_parent"android:text="插入一串实验数据"android:id="@+id/btnInsertRec"></Button>
- <Buttonandroid:layout_height="wrap_content"android:id="@+id/btnClose"
- android:text="关闭数据库"android:layout_width="fill_parent"></Button>
- <EditTextandroid:text="@+id/EditText01"android:id="@+id/EditText01"
- android:layout_width="fill_parent"android:layout_height="256dip"></EditText>
- <GridViewandroid:id="@+id/gridview"android:layout_width="fill_parent"
- android:layout_height="32dip"android:numColumns="auto_fit"
- android:columnWidth="40dip"></GridView>
- </LinearLayout>
本文程序源码如下:
- packagecom.testSQLite;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importandroid.app.Activity;
- importandroid.database.Cursor;
- importandroid.database.SQLException;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.GridView;
- importandroid.widget.SimpleAdapter;
- publicclasstestSQLiteextendsActivity{
- /**Calledwhentheactivityisfirstcreated.*/
- ButtonbtnCreateDB,btnInsert,btnClose;
- EditTextedtSQL;//显示分页数据
- SQLiteDatabasedb;
- intid;//添加记录时的id累加标记,必须全局
- staticfinalintPageSize=10;//分页时,每页的数据总数
- privatestaticfinalStringTABLE_NAME="stu";
- privatestaticfinalStringID="id";
- privatestaticfinalStringNAME="name";
- SimpleAdaptersaPageID;//分页栏适配器
- ArrayList<HashMap<String,String>>lstPageID;//分页栏的数据源,与PageSize和数据总数相关
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btnCreateDB=(Button)this.findViewById(R.id.btnCreateDB);
- btnCreateDB.setOnClickListener(newClickEvent());
- btnInsert=(Button)this.findViewById(R.id.btnInsertRec);
- btnInsert.setOnClickListener(newClickEvent());
- btnClose=(Button)this.findViewById(R.id.btnClose);
- btnClose.setOnClickListener(newClickEvent());
- edtSQL=(EditText)this.findViewById(R.id.EditText01);
- GridViewgridview=(GridView)findViewById(R.id.gridview);//分页栏控件
- //生成动态数组,并且转入数据
- lstPageID=newArrayList<HashMap<String,String>>();
- //生成适配器的ImageItem<====>动态数组的元素,两者一一对应
- saPageID=newSimpleAdapter(testSQLite.this,//没什么解释
- lstPageID,//数据来源
- R.layout.pagebuttons,//XML实现
- newString[]{"ItemText"},
- newint[]{R.id.ItemText});
- //添加并且显示
- gridview.setAdapter(saPageID);
- //添加消息处理
- gridview.setOnItemClickListener(newOnItemClickListener(){
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
- longarg3){
- LoadPage(arg2);//根据所选分页读取对应的数据
- }
- });
- }
- classClickEventimplementsView.OnClickListener{
- @Override
- publicvoidonClick(Viewv){
- if(v==btnCreateDB){
- CreateDB();
- }elseif(v==btnInsert){
- InsertRecord(16);//插入16条记录
- RefreshPage();
- }elseif(v==btnClose){
- db.close();
- }
- }
- }
- /*
- *读取指定ID的分页数据
- *SQL:Select*FromTABLE_NAMELimit9Offset10;
- *表示从TABLE_NAME表获取数据,跳过10行,取9行
- */
- voidLoadPage(intpageID)
- {
- Stringsql="select*from"+TABLE_NAME+
- "Limit"+String.valueOf(PageSize)+"Offset"+String.valueOf(pageID*PageSize);
- Cursorrec=db.rawQuery(sql,null);
- setTitle("当前分页的数据总数:"+String.valueOf(rec.getCount()));
- //取得字段名称
- Stringtitle="";
- intcolCount=rec.getColumnCount();
- for(inti=0;i<colCount;i++)
- title=title+rec.getColumnName(i)+"";
- //列举出所有数据
- Stringcontent="";
- intrecCount=rec.getCount();
- for(inti=0;i<recCount;i++){//定位到一条数据
- rec.moveToPosition(i);
- for(intii=0;ii<colCount;ii++)//定位到一条数据中的每个字段
- {
- content=content+rec.getString(ii)+"";
- }
- content=content+"/r/n";
- }
- edtSQL.setText(title+"/r/n"+content);//显示出来
- rec.close();
- }
- /*
- *在内存创建数据库和数据表
- */
- voidCreateDB(){
- //在内存创建数据库
- db=SQLiteDatabase.create(null);
- Log.e("DBPath",db.getPath());
- Stringamount=String.valueOf(databaseList().length);
- Log.e("DBamount",amount);
- //创建数据表
- Stringsql="CREATETABLE"+TABLE_NAME+"("+ID
- +"textnotnull,"+NAME+"textnotnull"+");";
- try{
- db.execSQL("DROPTABLEIFEXISTS"+TABLE_NAME);
- db.execSQL(sql);
- }catch(SQLExceptione){}
- }
- /*
- *插入N条数据
- */
- voidInsertRecord(intn){
- inttotal=id+n;
- for(;id<total;id++){
- Stringsql="insertinto"+TABLE_NAME+"("+ID+","+NAME
- +")values('"+String.valueOf(id)+"','test');";
- try{
- db.execSQL(sql);
- }catch(SQLExceptione){
- }
- }
- }
- /*
- *插入之后刷新分页
- */
- voidRefreshPage()
- {
- Stringsql="selectcount(*)from"+TABLE_NAME;
- Cursorrec=db.rawQuery(sql,null);
- rec.moveToLast();
- longrecSize=rec.getLong(0);//取得总数
- rec.close();
- intpageNum=(int)(recSize/PageSize)+1;//取得分页数
- lstPageID.clear();
- for(inti=0;i<pageNum;i++){
- HashMap<String,String>map=newHashMap<String,String>();
- map.put("ItemText","No."+String.valueOf(i));
- lstPageID.add(map);
- }
- saPageID.notifyDataSetChanged();
- }
- }