21天学习android开发教程之SQLite分页读取

Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作。不过有跨平台需求的程序就建议使用标准的SQL语句,毕竟这样容易在多个平台之间移植。
本文主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表、插入数据,关闭数据库,以及使用GridView实现了一个分页栏(关于GridView的用法),用于把数据分页显示。
分页栏的pagebuttons.xml的源码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:paddingBottom="4dip"
    android:layout_width="fill_parent">
    <TextView android: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的源码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:id="@+id/btnCreateDB"
        android:text="创建数据库"></Button>
    <Button android:layout_height="wrap_content"
        android:layout_width="fill_parent" android:text="插入一串实验数据" android:id="@+id/btnInsertRec"></Button>
    <Button android:layout_height="wrap_content" android:id="@+id/btnClose"
        android:text="关闭数据库" android:layout_width="fill_parent"></Button>
    <EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
        android:layout_width="fill_parent" android:layout_height="256dip"></EditText>
    <GridView android:id="@+id/gridview" android:layout_width="fill_parent"
        android:layout_height="32dip" android:numColumns="auto_fit"
        android:columnWidth="40dip"></GridView>
</LinearLayout>

本文程序源码如下:

package com.testSQLite; 

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();
  }
} 

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Android实现基于滑动的SQLite数据分页加载技术(附demo源码下载)

    本文实例讲述了Android实现基于滑动的SQLite数据分页加载技术.分享给大家供大家参考,具体如下: main.xml如下: <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:showAs

  • Android提高之SQLite分页表格实现方法

    继前一篇文章讲到Android上的SQLite分页读取,其功能只是用文本框显示数据而已.本文就讲得更加深入些,实现并封装一个SQL分页表格控件,不仅支持分页还是以表格的形式展示数据. 先来看看本文程序运行的动画如下图所示: 这个SQL分页表格控件主要分为"表格区"和"分页栏"这两部分,这两部分都是基于GridView实现的.网上介绍Android上实现表格的DEMO一般都用ListView.ListView与GridView对比,ListView最大的优势是格单元的

  • Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解

    本文实例讲述了Android操作SQLite数据库(增.删.改.查.分页等)及ListView显示数据的方法.分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦: 步骤如下: 一.介绍: 此文主要是介绍怎么使用android自带的数据库SQLite,以及把后台的数据用ListView控件显示 二.新建一个android工程--DBSQLiteOperate 工程目录: 三.清单列表AndroidManifest.xml的配置

  • Android提高之SQLite分页读取实现方法

    一般来说,Android自身就包含了常用于嵌入式系统的SQLite,这样就免去了开发者自己移植安装的功夫.SQLite 支持多数SQL92标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作.不过有跨平台需求的程序还是建议使用标准的SQL语句,毕竟这样容易在多个平台之间进行移植. 先来贴出本文程序运行的结果图: 本文实例程序主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表.插入数据,关闭数

  • Android SQLite操作之大数据处理与同时读写方法

    本文实例讲述了Android SQLite操作之大数据处理与同时读写方法.分享给大家供大家参考,具体如下: 1. 批量写入 采用事物方式,先缓存数据,再批量写入数据,极大提高了速度 288条,直接inset into 耗时7秒 8640条,   批量写入 耗时5-7秒 try { this.myDataBase.beginTransaction(); // 手动设置开始事务 for (int i = 0; i < objArr.length; i++) { this.myDataBase.exe

  • Android App使用SQLite数据库的一些要点总结

    /DATA/data/包名/databases是该程序存放数据的目录,DATA是Environment.getDataDirectory() 方法返回的路径.找到数据库之后可以选中user.db 执行导出. 用真机调试,data目录如果打不开,说明你的手机没有root,改用模拟器就OK了. 1.获取SQLiteDatabase对象: SQLiteDatabase db = openOrCreateDatabase(File file, SQLiteDatabase.Cursor, Factory

  • 详解Android中一些SQLite的增删改查操作

    在Android开发中经常要涉及到对数据的操作.Android本身提供了四种数据存储方式.包括:SharePreference,SQLite,Content Provider,File. 在Android,数据都是么私有的,要实现数据共享,正确方式是使用Content Provider. SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式.Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API. Sha

  • Android应用开发之将SQLite和APK一起打包的方法

    在 Eclipse 里新建好工程后,默认会有一个assets目录,在 Eclipse 中直接将准备好的 SQLite 数据库复制到该目录中,然后在主 Activity 里面编码: package com.test.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEn

  • Android编程之SMS读取短信并保存到SQLite的方法

    本文实例讲述了Android编程之SMS读取短信并保存到SQLite的方法.分享给大家供大家参考,具体如下: Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制) 现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后读取SQLite数据库提取短信,并显示 SMS短信SQLite存取代码: package com.homer.sms; import java.sql.Date; imp

  • 21天学习android开发教程之SQLite分页读取

    Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫.SQLite 支持多数 SQL92 标准,很多常用的SQL命令都能在SQLite上面使用,除此之外Android还提供了一系列自定义的方法去简化对SQLite数据库的操作.不过有跨平台需求的程序就建议使用标准的SQL语句,毕竟这样容易在多个平台之间移植. 本文主要讲解了SQLite的基本用法,如:创建数据库,使用SQL命令查询数据表.插入数据,关闭数据库,以及使用GridView实现了一个分页栏(关于GridVi

  • 21天学习android开发教程之MediaPlayer

    本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了.MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView.SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库. 先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面

  • 21天学习android开发教程之SurfaceView

    上一篇文章介绍了MediaPlayer相关内容,这次用两篇文章来介绍SurfaceView的用法.网上介绍SurfaceView的用法有很多,写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost. 先来看看程序运行的截图: 截图1主要演示了直接把正弦波绘画在SurfaceView上 对比上

  • 21天学习android开发教程之SurfaceView与多线程的混搭

    上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭.SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用.android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了.直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图.         本文程序运行截图如下,左边是开单个线程读取并绘图,右边是开两个线程,一个专门读取图片,一个专门绘图: 对比一下,右边动画的

  • 21天学习android开发教程之XML解析与生成

    本文使用SAX来解析XML,在Android里面可以使用SAX和DOM,DOM需要把整个XML文件读入内存再解析,比较消耗内存,而SAX基于事件驱动的处理方式,可以在各节点触发回调函数,不过SAX适合节点结构简单的XML文档,复杂的XML文档在后期的节点深度处理会有点麻烦. 本文要解析的test.xml文件如下: <?xml version="1.0" encoding="utf-8"?> <test> <title>testSA

  • Android开发教程之shape和selector的结合使用

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和selector在美化控件中的作用是至关重要的. 1.Shape 简介 作用:XML中定义的几何形状 位置:res/drawable/文件的名称.xml 使用的方法: Java代码中:R.drawable.文件的名称 XML中:android:background="@drawable/文件的名称&

  • Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】

    本文实例讲述了Android开发教程之Fragment定义.创建与使用方法.分享给大家供大家参考,具体如下: 概述 Fragment是activity的界面中的一部分或一种行为.你可以把多个Fragment们组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment.你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到

  • android开发教程之listview显示sqlite数据

    复制代码 代码如下: package com.it.db; import java.util.List;import com.it.dao.PersonDao;import com.it.domain.Person;import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.View;import android.view.ViewGroup;impo

  • Android开发教程之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数据暴露的.那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URL来表示外界需要访问的"数据库". ContentProvider提供了一种多应用间数据共享的方式. ContentProvider是个实现了一组用于提供其他应用程序存取数据的标准方法的类.应用

  • android开发教程之ubuntu使用adb连接小米2的步骤和adb调试方法

    步骤:分两步 一.usb连接: 在Ubuntu挂载使用MTP设备步骤如下: 1.将MTP设备连接至PC机 2.如果是第一次使用MTP设备需要安装以下软件,否则可以跳过此步骤: 复制代码 代码如下: $ sudo apt-get install mtpfs libfuse-dev libmad0-dev 3.挂载MTP设备 复制代码 代码如下: $ sudo mtpfs -o allow_other /media/mtp 如果提示设备忙,可以等一会再挂载. 二.adb调试: 复制代码 代码如下:

随机推荐