HardBirch

Android提高第八篇之SQLite分页读取

时间:10-11-16 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:43 点击: 17,201 次

        Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作。不过有跨平台需求的程序就建议使用标准的SQL语句,毕竟这样容易在多个平台之间移植。

先贴出本文程序运行的结果:

本文主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表、插入数据,关闭数据库,以及使用GridView实现了一个分页栏(关于GridView的用法),用于把数据分页显示。

分页栏的pagebuttons.xml的源码如下:










main.xml的源码如下:


















本文程序源码如下:

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.SimpleAdapter;

public class testSQLite extends Activity {
/** Called when the activity is first created. */
Button btnCreateDB, btnInsert, btnClose;
EditText edtSQL;//显示分页数据
SQLiteDatabase db;
int id;//添加记录时的id累加标记,必须全局
static final int PageSize=10;//分页时,每页的数据总数
private static final String TABLE_NAME = "stu";
private static final String ID = "id";
private static final String NAME = "name";

SimpleAdapter saPageID;// 分页栏适配器
ArrayList<HashMap<String, String>> lstPageID;// 分页栏的数据源,与PageSize和数据总数相关

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnCreateDB = (Button) this.findViewById(R.id.btnCreateDB);
btnCreateDB.setOnClickListener(new ClickEvent());

btnInsert = (Button) this.findViewById(R.id.btnInsertRec);
btnInsert.setOnClickListener(new ClickEvent());

btnClose = (Button) this.findViewById(R.id.btnClose);
btnClose.setOnClickListener(new ClickEvent());

edtSQL=(EditText)this.findViewById(R.id.EditText01);

GridView gridview = (GridView) findViewById(R.id.gridview);//分页栏控件
// 生成动态数组,并且转入数据
lstPageID = new ArrayList<HashMap<String, String>>();

// 生成适配器的ImageItem <====> 动态数组的元素,两者一一对应
saPageID = new SimpleAdapter(testSQLite.this, // 没什么解释
lstPageID,// 数据来源
R.layout.pagebuttons,//XML实现
new String[] { "ItemText" },
new int[] { R.id.ItemText });

// 添加并且显示
gridview.setAdapter(saPageID);
// 添加消息处理
gridview.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
LoadPage(arg2);//根据所选分页读取对应的数据
}
});

}

class ClickEvent implements View.OnClickListener {

@Override
public void onClick(View v) {
if (v == btnCreateDB) {
CreateDB();
} else if (v == btnInsert) {
InsertRecord(16);//插入16条记录
RefreshPage();
}else if (v == btnClose) {
db.close();
}
}

}

/*
* 读取指定ID的分页数据
* SQL:Select * From TABLE_NAME Limit 9 Offset 10;
* 表示从TABLE_NAME表获取数据,跳过10行,取9行
*/
void LoadPage(int pageID)
{
String sql= "select * from " + TABLE_NAME +
" Limit "+String.valueOf(PageSize)+ " Offset " +String.valueOf(pageID*PageSize);
Cursor rec = db.rawQuery(sql, null);

setTitle("当前分页的数据总数:"+String.valueOf(rec.getCount()));

// 取得字段名称
String title = "";
int colCount = rec.getColumnCount();
for (int i = 0; i < colCount; i++)
title = title + rec.getColumnName(i) + " ";

// 列举出所有数据
String content="";
int recCount=rec.getCount();
for (int i = 0; i < recCount; i++) {//定位到一条数据
rec.moveToPosition(i);
for(int ii=0;ii<colCount;ii++)//定位到一条数据中的每个字段
{
content=content+rec.getString(ii)+" ";
}
content=content+"/r/n";
}

edtSQL.setText(title+"/r/n"+content);//显示出来
rec.close();
}

/*
* 在内存创建数据库和数据表
*/
void CreateDB() {
// 在内存创建数据库
db = SQLiteDatabase.create(null);
Log.e("DB Path", db.getPath());
String amount = String.valueOf(databaseList().length);
Log.e("DB amount", amount);
// 创建数据表
String sql = "CREATE TABLE " + TABLE_NAME + " (" + ID
+ " text not null, " + NAME + " text not null " + ");";
try {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
db.execSQL(sql);
} catch (SQLException e) {}
}

/*
* 插入N条数据
*/
void InsertRecord(int n) {
int total = id + n;
for (; id < total; id++) {
String sql = "insert into " + TABLE_NAME + " (" + ID + ", " + NAME
+ ") values('" + String.valueOf(id) + "', 'test');";
try {
db.execSQL(sql);
} catch (SQLException e) {
}
}
}

/*
* 插入之后刷新分页
*/
void RefreshPage()
{
String sql = "select count(*) from " + TABLE_NAME;
Cursor rec = db.rawQuery(sql, null);
rec.moveToLast();
long recSize=rec.getLong(0);//取得总数
rec.close();
int pageNum=(int)(recSize/PageSize) + 1;//取得分页数

lstPageID.clear();
for (int i = 0; i < pageNum; i++) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("ItemText", "No." + String.valueOf(i));

lstPageID.add(map);
}
saPageID.notifyDataSetChanged();
}
}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android提高第八篇之SQLite分页读取

Android提高第八篇之SQLite分页读取:目前有43 条留言

  1. 43楼
    kf156:

    [e01]先抢沙发

    2010-11-16 11:42 [回复]
  2. 42楼
    yangc_83:

    [e01][e03]

    2010-11-16 11:50 [回复]
  3. 41楼
    yahier:

    学习 先复制 部署 晚些时候 有问题再贴过来[e04]

    2010-11-16 13:31 [回复]
  4. 40楼
    steven_chan:

    [e01],继续。

    2010-11-16 14:57 [回复]
  5. 39楼
    hmc1985:

    [e01]

    2010-11-16 15:41 [回复]
  6. 38楼
    huanghr_1:

    谢谢分享。

    2010-11-16 21:10 [回复]
  7. 37楼
    renfujiang:

    我很想试试这方面的,找到了

    2010-11-17 00:11 [回复]
  8. 36楼
    tqwboy:

    一直在寻找这个,不顶不行阿[e01]

    2010-11-17 09:17 [回复]
  9. 35楼
    huangbq:

    不错 学习了,多谢分享

    2010-11-17 10:01 [回复]
  10. 34楼
    kangaroog:

    感谢分享,学习[e01]

    2010-11-17 11:41 [回复]
  11. 33楼
    thisam:

    顶一把

    2010-11-17 14:06 [回复]
  12. 32楼
    freemancy:

    每隔几天一个精品…感谢了…入门教程..[e03][e03][e03][e03][e03][e03]

    2010-11-17 15:09 [回复]
  13. 31楼
    renfujiang:

    我练习了,当执行到db.execSQL(sql); 怎么提示 table stu has no colum named name

    db.execSQL(sql)是void InsertRecord(int n) 这个方法里面的

    2010-11-17 17:19 [回复]
  14. 30楼
    hellogv:

    回复 renfujiang:
    先创建数据库,才能插入数据

    2010-11-17 18:17 [回复]
  15. [e10][e09][e07][e06][e05][e03][e02][e01]

    2010-11-18 10:23 [回复]
  16. 28楼
    wfkbyni:

    [e10]

    2010-11-18 13:04 [回复]
  17. 27楼
    euler_yang:

    [e01]

    2010-11-18 15:54 [回复]
  18. [e01]

    2010-11-18 22:16 [回复]
  19. 25楼
    victorye81:

    好东东!

    2010-11-18 23:47 [回复]
  20. 24楼
    qiuqingpo:

    [e06]好

    2010-11-19 16:26 [回复]
  21. 23楼
    JackyHallen:

    又是好东西

    2010-11-20 11:32 [回复]
  22. 22楼
    cll007:

    这是我想要的,谢谢,哈哈

    2010-11-20 17:49 [回复]
  23. 21楼
    WolfMvP:

    不能不说你小子很牛叉!呵呵,支持!

    2010-11-20 17:53 [回复]
  24. 谢谢分享[e01]

    2010-11-21 22:40 [回复]
  25. 谢谢分享!

    2010-11-22 08:44 [回复]
  26. 18楼
    tenseason:

    OnItemClickListener() 要改为

    AdapterView.OnItemClickListener()

    2010-12-10 14:45 [回复]
  27. 兄弟,你好,我做android将近3年了,有机会可以和我交流下:你可以去isomobile.com上 看一下一个叫赵小刚的人的帖子,多提意见,谢谢了:)

    2011-01-10 09:34 [回复]
  28. [e01],帮了大忙了,谢谢分享!

    2011-02-28 09:15 [回复]
  29. 15楼
    hugengzong:

    再顶再看[e04]

    2011-05-12 10:41 [回复]
  30. [e10]

    2011-05-23 15:58 [回复]
  31. [e01]

    2011-05-24 09:39 [回复]
  32. 12楼
    javazxm2011:

    非常感谢!

    2011-07-19 13:52 [回复]
  33. 11楼
    daixj110:

    楼主的gif图片是怎么制作的,用了什么软件吗?

    2011-07-21 15:30 [回复]
  34. 10楼
    liuc0317:

    写不很好。我把你的代码搞下来。效果不一样。把/r/n也给输出了。你的sdk是几的版本了。

    2011-09-30 10:22 [回复]
  35. 9楼
    liuc0317:

    解决了。把你那个/r/n换成rn结果就一样了。我的sdk是2.2的

    2011-09-30 10:25 [回复]
  36. 嗯嗯

    2012-01-06 18:43 [回复]
  37. 有源代码就更好了

    2012-01-06 18:43 [回复]
  38. 6楼
    zgzhaobo:

    张兄,请问您系列博文中的演示动画是如何生成和添加的,谢谢! zgzhaobo@gmail.com

    2012-02-28 15:47 [回复]
  39. 5楼
    hellogv:

    [reply]zgzhaobo[/reply]
    Xtzj GifMaker.exe

    2012-02-28 22:09 [回复]
  40. 4楼
    zgzhaobo:

    [reply]hellogv[/reply]
    tks~

    2012-02-29 09:34 [回复]
  41. 地板
    gycxgycx:

    楼主你好,就是这一篇,我想知道怎么把数据库的数据读到gridview里显示,而不是显示在textview里……

    2012-07-17 13:00 [回复]
  42. 板凳
    hellogv:

    [reply]gycxgycx[/reply]
    1.学会读写数据库
    2.学会GridView和BaseAdapter

    2012-07-22 11:32 [回复]
  43. 你好请问我用的BaseAdapter来加滑动载数据,但是我删除一条记录以后要如何更新呢,以及在加载一定数据后如何将之前的数据清除。谢谢

    2012-08-10 22:53 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐