Android开发之SQLite详解

本文详细介绍了SQLite数据库在Android开发中的应用,包括SQLiteOpenHelper的使用、数据类型、SQL语句操作以及如何创建、更新和删除数据。通过示例展示了如何在Android中进行数据操作,并提供了分页显示数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLite简介
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:

1.轻量级

使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

2.独立性

SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

3.隔离性

SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。

4.跨平台

SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

5.多语言接口

SQLite 数据库支持多语言编程接口。

6.安全性

SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。


当然,要说到SQLite就必须说道SQLiteOpenHelper

SQLiteOpenHelper类介绍

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。

方法名 方法描述
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) 构造方法,一般是传递一个要创建的数据库名称那么参数
onCreate(SQLiteDatabase db) 创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) 版本更新时调用
getReadableDatabase() 创建或打开一个只读数据库
getWritableDatabase() 创建或打开一个读写数据库

private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}}
private final static String CREATE_TABLE = "CREATE TABLE .......";
private final static String DB_NAME = "jeasonnetmontioring.db";

// 读写的形式打开数据库,返回数据库对象
public void open() throws SQLException {
mDatabaseHelper = new DatabaseHelper(mContext);
mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();
}
public void close() {
mDatabaseHelper.close();
}

private SQLiteDatabase mSQLiteDatabase = null;
private DatabaseHelper mDatabaseHelper = null;

值得一提的是SQLite数据库是 嵌入式关系型数据库

1、SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。

2、SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。

3、但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。

4、另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段的类型信息:

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

 

SQLite可以解析大部分标准SQL语句,如:

查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句

如:select * from person

        select * from person order by id desc

        select name from person group by name having count(*)>1

分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录

select * from Account limit 5 offset 3 或者 select * from Account limit 3,5

插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)

更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10

删除语句:delete from 表名 where 条件子句。如:delete from person  where id=10



使用SQLiteOpenHelper获取用于操作数据库的SQLiteDatabase实例
public class DatabaseHelper extends SQLiteOpenHelper {
         private static final String name = "itcast"; //数据库名称
         private static final int version = 1; //数据库版本
         ......略
}
public class HelloActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        ......
        Button button =(Button) this.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
db.close();  
}});        
    }
}
第一次调用getWritableDatabase()或getReadableDatabase()方法后,SQLiteOpenHelper会缓存当前的SQLiteDatabase实例,SQLiteDatabase实例正常情况下会维持数据库的打开状态,所以在你不再需要SQLiteDatabase实例时,请及时调用close()方法释放资源。一旦SQLiteDatabase实例被缓存,多次调用getWritableDatabase()或getReadableDatabase()方法得到的都是同一实例。
使用事务操作SQLite数据库
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction()方法之前使用setTransactionSuccessful() 方法设置事务的标志为成功,如果不调用setTransactionSuccessful() 方法,默认会回滚事务。使用例子如下: SQLiteDatabase db = ....;
db.beginTransaction();//开始事务
try {
    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
    db.execSQL("update person set name=? where personid=?", new Object[]{"传智", 1});
    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
} finally {
    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
db.close(); 
上面两条SQL语句在同一个事务中执行。
SQLite示例程序

   1.创建Android工程

       Project name: db

       BuildTarget:Android2.2

       Application name: 数据库应用

       Package name: com.jbridge.db

       Create Activity: DBActivity

       Min SDK Version:8、

 2. Person实体

 

Java代码   收藏代码
  1. package com.jbridge.domain;  
  2.   
  3. import android.R.string;  
  4.   
  5. public class Person {  
  6.     private Integer id;  
  7.     private String name;  
  8.     private Short age;  
  9.   
  10.     public Person(String name, Short age) {  
  11.         this.name = name;  
  12.         this.age = age;  
  13.     }  
  14.   
  15.     public Person(Integer id, String name, Short age) {  
  16.         super();  
  17.         this.id = id;  
  18.         this.name = name;  
  19.         this.age = age;  
  20.     }  
  21.   
  22.     public Integer getId() {  
  23.         return id;  
  24.     }  
  25.   
  26.     public void setId(Integer id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.     public String getName() {  
  31.         return name;  
  32.     }  
  33.   
  34.     public void setName(String name) {  
  35.         this.name = name;  
  36.     }  
  37.   
  38.     public Short getAge() {  
  39.         return age;  
  40.     }  
  41.   
  42.     public void setAge(Short age) {  
  43.         this.age = age;  
  44.     }  
  45.   
  46.     @Override  
  47.     public String toString() {  
  48.         return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";  
  49.     }  
  50.   
  51. }  
 

  3.编写DataBaseOpenHelper类

      DataBaseOpenHelper继承自SQLiteOpenHelper类。我们需要创建数据表,必须重写onCreate(更新时重写onUpgrade方法)方法,在这个方法中创建数据表。

 

Java代码   收藏代码
  1. package com.jbridge.service;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class DataBaseOpenHelper extends SQLiteOpenHelper {  
  9.     // 类没有实例化,是不能用作父类构造器的参数,必须声明为静态  
  10.     private static String dbname = "zyj";  
  11.     private static int version = 1;  
  12.   
  13.     public DataBaseOpenHelper(Context context) {  
  14.         // 第一个参数是应用的上下文  
  15.         // 第二个参数是应用的数据库名字  
  16.         // 第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类  
  17.         // 第四个参数是数据库版本,必须是大于0的int(即非负数)  
  18.         super(context, dbname, null, version);  
  19.         // TODO Auto-generated constructor stub  
  20.     }  
  21.   
  22.     public DataBaseOpenHelper(Context context, String name,  
  23.             CursorFactory factory, int version) {  
  24.         super(context, name, factory, version);  
  25.         // TODO Auto-generated constructor stub  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onCreate(SQLiteDatabase db) {  
  30.         db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");  
  31.     }  
  32.   
  33.     // onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。  
  34.     // 一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失,从版本几更新到版本几。  
  35.     @Override  
  36.     public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {  
  37.         db.execSQL("DROP TABLE IF EXISTS person");  
  38.         onCreate(db);  
  39.     }  
  40.   
  41. }  
  4.编写PersonService类

      PersonService类主要实现对业务逻辑和数据库的操作。

 

Java代码   收藏代码
  1. package com.jbridge.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Currency;  
  5. import java.util.List;  
  6.   
  7. import android.content.Context;  
  8. import android.database.Cursor;  
  9. import android.database.sqlite.SQLiteDatabase;  
  10.   
  11. import com.jbridge.domain.Person;  
  12.   
  13. public class PersonService {  
  14.   
  15.     private DataBaseOpenHelper dbOpenHelper;  
  16.   
  17.     // private Context context;  
  18.   
  19.     public PersonService(Context context) {  
  20.         // this.context = context;  
  21.         dbOpenHelper = new DataBaseOpenHelper(context);  
  22.     }  
  23.   
  24.     public void save(Person person) {  
  25.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  26.         database.beginTransaction();  
  27.         database.execSQL("insert into person(name,age)values(?,?)",  
  28.                 new Object[] { person.getName(), person.getAge() });  
  29.         // database.close();可以不关闭数据库,他里面会缓存一个数据库对象,如果以后还要用就直接用这个缓存的数据库对象。但通过  
  30.         // context.openOrCreateDatabase(arg0, arg1, arg2)打开的数据库必须得关闭  
  31.         database.setTransactionSuccessful();  
  32.         database.endTransaction();  
  33.   
  34.     }  
  35.   
  36.     public void update(Person person) {  
  37.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  38.         database.execSQL(  
  39.                 "update person set name=?,age=? where personid=?",  
  40.                 new Object[] { person.getName(), person.getAge(),  
  41.                         person.getId() });  
  42.     }  
  43.   
  44.     public Person find(Integer id) {  
  45.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  46.         Cursor cursor = database.rawQuery(  
  47.                 "select * from person where personid=?",  
  48.                 new String[] { String.valueOf(id) });  
  49.         if (cursor.moveToNext()) {  
  50.             return new Person(cursor.getInt(0), cursor.getString(1),  
  51.                     cursor.getShort(2));  
  52.         }  
  53.         return null;  
  54.     }  
  55.   
  56.     public void delete(Integer... ids) {  
  57.         if (ids.length > 0) {  
  58.             StringBuffer sb = new StringBuffer();  
  59.             for (Integer id : ids) {  
  60.                 sb.append('?').append(',');  
  61.             }  
  62.             sb.deleteCharAt(sb.length() - 1);  
  63.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  64.             database.execSQL(  
  65.                     "delete from person where personid in(" + sb.toString()  
  66.                             + ")", ids);  
  67.         }  
  68.     }  
  69.   
  70.     public List<Person> getScrollData(int startResult, int maxResult) {  
  71.         List<Person> persons = new ArrayList<Person>();  
  72.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  73.         Cursor cursor = database.rawQuery(  
  74.                 "select * from person limit ?,?",  
  75.                 new String[] { String.valueOf(startResult),  
  76.                         String.valueOf(maxResult) });  
  77.         while (cursor.moveToNext()) {  
  78.             persons.add(new Person(cursor.getInt(0), cursor.getString(1),  
  79.                     cursor.getShort(2)));  
  80.         }  
  81.         return persons;  
  82.     }  
  83.   
  84.     // 获取分页数据,提供给SimpleCursorAdapter使用。  
  85.     public Cursor getRawScrollData(int startResult, int maxResult) {  
  86.         List<Person> persons = new ArrayList<Person>();  
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  88.         return database.rawQuery(  
  89.                 "select personid as _id ,name,age from person limit ?,?",  
  90.                 new String[] { String.valueOf(startResult),  
  91.                         String.valueOf(maxResult) });  
  92.   
  93.     }  
  94.   
  95.     public long getCount() {  
  96.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  97.         Cursor cursor = database.rawQuery("select count(*) from person"null);  
  98.         if (cursor.moveToNext()) {  
  99.             return cursor.getLong(0);  
  100.         }  
  101.         return 0;  
  102.     }  
  103.   
  104. }  

 下面是使用 insert()、delete()、update()和query()方法实现的业务类

 

Java代码   收藏代码
  1. package com.jbridge.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Currency;  
  5. import java.util.List;  
  6.   
  7. import android.R.string;  
  8. import android.content.ContentValues;  
  9. import android.content.Context;  
  10. import android.database.Cursor;  
  11. import android.database.sqlite.SQLiteDatabase;  
  12.   
  13. import com.jbridge.domain.Person;  
  14.   
  15. public class OtherPersonService {  
  16.   
  17.     private DataBaseOpenHelper dbOpenHelper;  
  18.   
  19.     // private Context context;  
  20.   
  21.     public OtherPersonService(Context context) {  
  22.         // this.context = context;  
  23.         dbOpenHelper = new DataBaseOpenHelper(context);  
  24.     }  
  25.   
  26.     public void save(Person person) {  
  27.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  28.         ContentValues contentValues = new ContentValues();  
  29.         contentValues.put("name", person.getName());  
  30.         contentValues.put("age", person.getAge());  
  31.         database.insert("person"null, contentValues);  
  32.     }  
  33.   
  34.     public void update(Person person) {  
  35.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  36.         ContentValues contentValues = new ContentValues();  
  37.         contentValues.put("name", person.getName());  
  38.         contentValues.put("age", person.getAge());  
  39.         database.update("person"null"personid=?",  
  40.                 new String[] { String.valueOf(person.getId()) });  
  41.     }  
  42.   
  43.     public Person find(Integer id) {  
  44.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  45.         Cursor cursor = database.query("person"new String[] { "personid",  
  46.                 "name""age" }, "personid=?",  
  47.                 new String[] { String.valueOf(id) }, nullnullnull);  
  48.         if (cursor.moveToNext()) {  
  49.             return new Person(cursor.getInt(0), cursor.getString(1),  
  50.                     cursor.getShort(2));  
  51.         }  
  52.         return null;  
  53.     }  
  54.   
  55.     public void delete(Integer... ids) {  
  56.         if (ids.length > 0) {  
  57.             StringBuffer sb = new StringBuffer();  
  58.             String[] strIds = new String[ids.length];  
  59.             // for (Integer id : ids) {  
  60.             // sb.append('?').append(',');  
  61.             // }  
  62.             for (int i = 0; i < strIds.length; i++) {  
  63.                 sb.append('?').append(',');  
  64.                 strIds[i] = String.valueOf(ids[i]);  
  65.             }  
  66.             sb.deleteCharAt(sb.length() - 1);  
  67.             SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  68.             database.delete("person""personid in(" + sb.toString() + ")",  
  69.                     strIds);  
  70.         }  
  71.     }  
  72.   
  73.     public List<Person> getScrollData(int startResult, int maxResult) {  
  74.         List<Person> persons = new ArrayList<Person>();  
  75.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  76.         Cursor cursor = database.query("person"new String[] { "personid",  
  77.                 "name""age" }, nullnullnullnull"personid desc",  
  78.                 startResult + "," + maxResult);  
  79.         while (cursor.moveToNext()) {  
  80.             persons.add(new Person(cursor.getInt(0), cursor.getString(1),  
  81.                     cursor.getShort(2)));  
  82.         }  
  83.         return persons;  
  84.     }  
  85.   
  86.     public long getCount() {  
  87.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  88.         Cursor cursor = database.query("person"new String[] { "count(*)" },  
  89.                 nullnullnullnullnull);  
  90.         if (cursor.moveToNext()) {  
  91.             return cursor.getLong(0);  
  92.         }  
  93.         return 0;  
  94.     }  
  95.   
  96. }  
    5.编写测试类

       编写一个针对PersonService的测试类,测试PersonService类中的各个方法是否正确。

 

Java代码   收藏代码
  1. package com.jbridge.db;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.jbridge.domain.Person;  
  6. import com.jbridge.service.OtherPersonService;  
  7. import com.jbridge.service.PersonService;  
  8.   
  9. import android.test.AndroidTestCase;  
  10. import android.util.Log;  
  11.   
  12. public class PersonServiceTest extends AndroidTestCase {  
  13.     private static String TAG = "PersonServiceTest";  
  14.   
  15.     // OtherPersonService personService = new  
  16.     // OtherPersonService(this.getContext());  
  17.     // //不可以这么写,因为Android把context环境变量是在PersonServiceTest实例化后给他的  
  18.   
  19.     public void testSave() throws Exception {  
  20.         PersonService personService = new PersonService(this.getContext());  
  21.         // personService.save(new Person("老猪", (short) 11));  
  22.         for (int i = 0; i < 10; i++) {  
  23.             personService.save(new Person("你" + i, (short) (i + 10)));  
  24.         }  
  25.   
  26.     }  
  27.   
  28.     public void testFind() throws Exception {  
  29.         PersonService personService = new PersonService(this.getContext());  
  30.         Person person = personService.find(1);  
  31.         Log.i(TAG, person.toString());  
  32.     }  
  33.   
  34.     public void testUpdate() throws Exception {  
  35.         PersonService personService = new PersonService(this.getContext());  
  36.         Person person = personService.find(1);  
  37.         person.setName("lv");  
  38.         personService.update(person);  
  39.     }  
  40.   
  41.     public void testDelete() throws Exception {  
  42.         PersonService personService = new PersonService(this.getContext());  
  43.         personService.delete(123);  
  44.     }  
  45.   
  46.     public void testGetCount() throws Exception {  
  47.         PersonService personService = new PersonService(this.getContext());  
  48.         Log.i(TAG, String.valueOf(personService.getCount()));  
  49.     }  
  50.   
  51.     public void testGetScrollData() throws Exception {  
  52.         PersonService personService = new PersonService(this.getContext());  
  53.         List<Person> persons = personService.getScrollData(03);  
  54.         for (Person person : persons) {  
  55.             Log.i(TAG, person.toString());  
  56.         }  
  57.     }  
  58. }  
     启用测试功能,不要忘记在AndroidManifest.xml文件中加入测试环境。为application元素添加一个子元素:<uses-library android:name="android.test.runner"/>,为application元素添加一个兄弟元素:<instrumentation android:name="android.test.InstrumentationTestRunner"     android:targetPackage="com.jbridge.db" android:label="Tests for My App" />。

 

       SQLite数据库以单个文件存储,就像微软的Access数据库。有一个查看SQLite数据库文件的工具——SQLite Developer,我们可以使用它来查看数据库。Android将创建的数据库存放在”/data/data/ com.jbridge.db/databases/person”,我们将它导出然后使用SQLite Developer打开。

 

  6.分页显示数据

       我们在ContactsService类中,提供了一个获取分页数据的方法。我们将调用它获取的数据,使用ListView组件显示出来。

       编辑mail.xml:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <RelativeLayout  
  8.   xmlns:android="http://schemas.android.com/apk/res/android"  
  9.   android:layout_width="fill_parent"  
  10.   android:layout_height="wrap_content">  
  11.   <TextView  
  12.   android:layout_width="40px"  
  13.   android:layout_height="wrap_content"  
  14.   android:textSize="20px"  
  15.   android:id="@+id/personidtitle"  
  16.   android:text="编号"  
  17.   />  
  18.    <TextView  
  19.   android:layout_width="200px"  
  20.   android:layout_height="wrap_content"  
  21.    android:textSize="20px"  
  22.   android:layout_toRightOf="@id/personidtitle"  
  23.    android:layout_alignTop="@id/personidtitle"  
  24.    android:gravity="center_horizontal"  
  25.    android:id="@+id/nametitle"  
  26.    android:text="姓名"  
  27.   />  
  28.    <TextView  
  29.   android:layout_width="wrap_content"  
  30.   android:layout_height="wrap_content"  
  31.    android:textSize="20px"  
  32.   android:layout_toRightOf="@id/nametitle"  
  33.    android:layout_alignTop="@id/nametitle"  
  34.    android:id="@+id/agetitle"  
  35.    android:text="年龄"  
  36.   />  
  37. </RelativeLayout>  
  38. <ListView    
  39.     android:layout_width="fill_parent"   
  40.     android:layout_height="wrap_content"   
  41.     android:id="@+id/listView"  
  42.     />  
  43. </LinearLayout>  
 

在mail.xml所在目录里添加一个personitem.xml:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="wrap_content">  
  6.   <TextView  
  7.   android:layout_width="40px"  
  8.   android:layout_height="wrap_content"  
  9.   android:textSize="20px"  
  10.   android:id="@+id/personid"  
  11.   />  
  12.    <TextView  
  13.   android:layout_width="200px"  
  14.   android:layout_height="wrap_content"  
  15.    android:textSize="20px"  
  16.   android:layout_toRightOf="@id/personid"  
  17.    android:layout_alignTop="@id/personid"  
  18.    android:gravity="center_horizontal"  
  19.    android:id="@+id/name"  
  20.   />  
  21.    <TextView  
  22.   android:layout_width="wrap_content"  
  23.   android:layout_height="wrap_content"  
  24.    android:textSize="20px"  
  25.   android:layout_toRightOf="@id/name"  
  26.    android:layout_alignTop="@id/name"  
  27.    android:id="@+id/age"  
  28.   />  
  29. </RelativeLayout>  
 

 编辑 DBActivity 类:

 

Java代码   收藏代码
  1. package com.jbridge.db;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6.   
  7. import com.jbridge.domain.Person;  
  8. import com.jbridge.service.PersonService;  
  9.   
  10. import android.R.string;  
  11. import android.app.Activity;  
  12. import android.database.Cursor;  
  13. import android.os.Bundle;  
  14. import android.provider.LiveFolders;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.widget.AdapterView;  
  18. import android.widget.ArrayAdapter;  
  19. import android.widget.ListView;  
  20. import android.widget.SimpleAdapter;  
  21. import android.widget.SimpleCursorAdapter;  
  22. import android.widget.Toast;  
  23.   
  24. public class DBActivity extends Activity {  
  25.     /** Called when the activity is first created. */  
  26.     private static final String TAG = "DBActivity";  
  27. /*实现方法一 
  28.      @Override 
  29.      public void onCreate(Bundle savedInstanceState) { 
  30.      super.onCreate(savedInstanceState); 
  31.      setContentView(R.layout.main); 
  32.      PersonService personService=new PersonService(this); 
  33.      ListView listView = (ListView) this.findViewById(R.id.listView); 
  34.      
  35.      List<HashMap<String, String>> data = new ArrayList<HashMap<String, 
  36.      String>>(); 
  37.      // HashMap<String, String> title = new HashMap<String, String>(); 
  38.      // title.put("personid", "编号"); 
  39.      // title.put("name", "姓名"); 
  40.      // title.put("age", "年龄"); 
  41.      // data.add(title); 
  42.      
  43.      List<Person> persons= personService.getScrollData(0, 10); 
  44.      for (Person person : persons) { 
  45.      HashMap<String, String> p = new HashMap<String, String>(); 
  46.      p.put("personid", String.valueOf(person.getId())); 
  47.      p.put("name", person.getName()); 
  48.      p.put("age",String.valueOf(person.getAge())); 
  49.      data.add(p); 
  50.      } 
  51.      
  52.      // 适配器有: 
  53.      // ArrayAdapter<T> 
  54.      // simpAdapter 
  55.      // SimpleCursorAdapter 
  56.      SimpleAdapter adapter = new SimpleAdapter(DBActivity.this, data, 
  57.      R.layout.personitem, 
  58.      new String[] { "personid", "name", "age" }, 
  59.      new int[] {R.id.personid, R.id.name, R.id.age }); 
  60.      listView.setAdapter(adapter); 
  61.      
  62.      listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
  63.      @Override 
  64.      // parent即为你点击的listView 
  65.      // view为listview的外面布局 
  66.      public void onItemClick(AdapterView<?> parent, View view, int position, 
  67.      long id) { 
  68.      ListView listView= (ListView) parent; 
  69.      HashMap<String, String> itemdata= (HashMap<String, String>) 
  70.      listView.getItemAtPosition(position); 
  71.      String personid=itemdata.get("personid"); 
  72.      String name=itemdata.get("name"); 
  73.      String age=itemdata.get("age"); 
  74.      Log.i(TAG,view.getClass().getName()); 
  75.      Log.i(TAG, "personid: "+personid+ "   name: "+name+"   age:   "+age); 
  76.      Log.i(TAG," position==id:"+ (position==id)); 
  77.     Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show(); 
  78.      } 
  79.      
  80.      }); 
  81.      
  82.      } 
  83.      
  84. */  
  85.       
  86. //  实现方法二(游标)  
  87.     @Override  
  88.     public void onCreate(Bundle savedInstanceState) {  
  89.         super.onCreate(savedInstanceState);  
  90.         setContentView(R.layout.main);  
  91.         PersonService personService = new PersonService(this);  
  92.         ListView listView = (ListView) this.findViewById(R.id.listView);  
  93.   
  94.         List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();  
  95.         // HashMap<String, String> title = new HashMap<String, String>();  
  96.         // title.put("personid", "编号");  
  97.         // title.put("name", "姓名");  
  98.         // title.put("age", "年龄");  
  99.         // data.add(title);  
  100.   
  101.         // 适配器有:  
  102.         // ArrayAdapter<T>  
  103.         // simpAdapter  
  104.         // SimpleCursorAdapter  
  105.         Cursor cursor = personService.getRawScrollData(010);  
  106.         SimpleCursorAdapter adapter = new SimpleCursorAdapter(DBActivity.this,  
  107.                 R.layout.personitem, cursor, new String[] { "_id""name",  
  108.                         "age" },  
  109.                 new int[] { R.id.personid, R.id.name, R.id.age });  
  110.         listView.setAdapter(adapter);  
  111.   
  112.         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  113.   
  114.             @Override  
  115.             // parent即为你点击的listView  
  116.             // view为listview的外面布局  
  117.             public void onItemClick(AdapterView<?> parent, View view,  
  118.                     int position, long id) {  
  119.                 ListView listView = (ListView) parent;  
  120.                 Cursor cursor = (Cursor) listView.getItemAtPosition(position);  
  121.                 String personid = String.valueOf(cursor.getInt(0));  
  122.                 String name = String.valueOf(cursor.getString(1));  
  123.                 String age = String.valueOf(cursor.getShort(2));  
  124.                 Log.i(TAG, view.getClass().getName());  
  125.                 Log.i(TAG, "personid: " + personid + "   name: " + name  
  126.                         + "   age:   " + age);  
  127.                 Log.i(TAG, " position==id:" + (position == id));  
  128.                 Toast.makeText(DBActivity.this, name, Toast.LENGTH_LONG).show();  
  129.             }  
  130.   
  131.         });  
  132.   
  133.     }  
  134. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值