谁有胆把自己大胆竟然敢看我朋友圈QQ留下,我去他空

安卓 SQLite数据库操作实例
- 小敏的博客 - ITeye技术网站
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。
在Android 运行时环境包含了完整的 SQLite。
首先介绍一下SQLite这个数据库:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。
举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。
但是有一种情况例外:当字段类型为
”Integer Primary Key” 时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。
SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
需要注意一点: SQLite不支持存储过程!
我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,
然后是我的Demo(一个简单的完成数据库增删查改操作):
首先是项目目录结构:
在本项目中我们使用JUnit测试,就要在AndroidManifest.xml配置JUnit
AndroidManifest.xml
&manifest xmlns:android="/apk/res/android"
package="org.yzsoft.sqlitedemo.test"
android:versionCode="1"
android:versionName="1.0" &
&!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 --&
android:minSdkVersion="8"
android:targetSdkVersion="15" /&
&application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &
因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置(
android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的
,虽然可以直接用
.类名,但是这个.类名是建立在
&manifest xmlns:android="/apk/res/android"
package="org.yzsoft.sqlitedemo.test"
之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。
android:name="org.yzsoft.sqlitedemo.activity.MainActivity"
android:label="@string/title_activity_main" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&!-- JUnit要加这句 --&
&uses-library android:name="android.test.runner" /&
&/application&
&!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) --&
&instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="Test Unit Tests"
android:targetPackage="org.yzsoft.sqlitedemo.test" &
&/instrumentation&
&/manifest&
1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)
package org.yzsoft.sqlitedemo.
import org.yzsoft.sqlitedemo.util.R;
import org.yzsoft.sqlitedemo.util.R.
import org.yzsoft.sqlitedemo.util.R.
import android.os.B
import android.app.A
import android.view.M
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
2、DBOpenHandler.java
package org.yzsoft.sqlitedemo.
import android.content.C
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteDatabase.CursorF
import android.database.sqlite.SQLiteOpenH
public class DBOpenHandler extends SQLiteOpenHelper {
* @param context
* @param name
* @param factory
可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。
* @param version
数据库版本号
public DBOpenHandler(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表
// 创建一个t_users表,id主键,自动增长,字符类型的username和
db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )");
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)
package org.yzsoft.sqlitedemo.
public class TUsers {
public int getId() {
public void setId(int id) {
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPass() {
public void setPass(String pass) {
this.pass =
4、SQLiteDAOImpl.java(数据库操作实现类)
package org.yzsoft.sqlitedemo.
import java.util.ArrayL
import java.util.L
import org.yzsoft.sqlitedemo.vo.TU
import android.content.C
import android.database.C
import android.database.sqlite.SQLiteD
public class SQLiteDAOImpl {
private DBOpenHandler dbOpenH
public SQLiteDAOImpl(Context context) {
this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1);
public void save(TUsers tusers) {// 插入记录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作
db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() });
db.close();// 记得关闭数据库操作
public void delete(Integer id) {// 删除纪录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
db.execSQL("delete from t_users where id=?", new Object[] { id.toString() });
db.close();
public void update(TUsers tusers) {// 修改纪录
SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() });
db.close();
public TUsers find(Integer id) {// 根据ID查找纪录
TUsers tusers =
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
// 用游标Cursor接收从数据库检索到的数据
Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() });
if (cursor.moveToFirst()) {// 依次取出数据
tusers = new TUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
db.close();
public List&TUsers& findAll() {// 查询所有记录
List&TUsers& lists = new ArrayList&TUsers&();
TUsers tusers =
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
// Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new
// String[]{offset.toString(),maxLength.toString()});
// //这里支持类型MYSQL的limit分页操作
Cursor cursor = db.rawQuery("select * from t_users ", null);
while (cursor.moveToNext()) {
tusers = new TUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
lists.add(tusers);
db.close();
public long getCount() {//统计所有记录数
SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
Cursor cursor = db.rawQuery("select count(*) from t_users ", null);
cursor.moveToFirst();
db.close();
return cursor.getLong(0);
5、TUsersTest.java(JUnit测试类)
package org.yzsoft.sqlitedemo.
import java.util.L
import org.yzsoft.sqlitedemo.util.DBOpenH
import org.yzsoft.sqlitedemo.util.SQLiteDAOI
import org.yzsoft.sqlitedemo.vo.TU
import android.test.AndroidTestC
import android.util.L
public class TUsersTest extends AndroidTestCase {
private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试
public void testCreate() {
DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件
dbHandler.getWritableDatabase();
public void testSave() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = new TUsers();
tuser.setUsername("用户");
tuser.setPass("密码");
p.save(tuser);
Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试
public void testUpate() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = p.find(1);
tuser.setUsername("张三");
p.update(tuser);
Log.i(TAG, "修改成功");
public void testDelete() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
p.delete(2);
Log.i(TAG, "删除成功");
public void testFind() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
TUsers tuser = p.find(1);
Log.i(TAG, tuser.getUsername() + "
public void testGetCount() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
Log.i(TAG, p.getCount() + "
总记录数");
public void testFindAll() throws Throwable {
SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
List&TUsers& tusers = p.findAll();
for (TUsers tuser : tusers) {
Log.i(TAG, tuser.getUsername() + "
然后是测试中的一些截图:
最后我们把File Exploer中data/data/项目包名/databases/dbtest.db 导出来,用Navicat Premium等数据库管理工具查看里面的数据:
导出来看看:
虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~
最最后~附上项目源码:
(675.4 KB)
下载次数: 315
浏览 24741
TUsersTest.java(JUnit测试类)怎么调用啊?求解答,谢谢.兄弟知道怎么调用了吗?
浏览: 106141 次
来自: 广西
&div class=&quote_title ...
菜鸟同问TUsersTest.java怎么调用?
这个问题还真是隐蔽 如果你不知道看localhost.log文 ...
TUsersTest.java(JUnit测试类)怎么调用啊? ...
你好,用这个DEMO启动就报错呀
[ERROR] [local ...Android SQLite数据库使用 学习与代码实践
SQLiteOpenHelper 类
  用&类中的&和方法可以获得数据库的引用。
  为了实现对数据库版本进行管理,&类提供了两个重要的方法,分别是&和&,前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。
  当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。
  onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
  onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。
  假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。
  当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后做出相应的表结构及数据更新。
SQLiteDatabase类
  Android提供了一个名为&的类( 类中的 和方法返回这个类的对象)。
  类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。
  SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。
  execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;
  rawQuery()方法用于执行select语句。
  首先是一个DatabaseHelper类,它继承了SQLiteOpenHelper,实现了onCreate和onUpgrade方法。
  虽然数据库的名字和版本都是在该类的构造函数中传入,但是数据库实际被创建是在该类的getWritableDatabase()或getReadableDatabase()方法第一次被调用时。
  第一次创建之后接着会调用onCreate方法(我们在这里创建了数据表),之后onCreate就不再被调用。
  DatabaseHelper类:
package com.example.
import android.content.C
import android.database.DatabaseErrorH
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteDatabase.CursorF
import android.database.sqlite.SQLiteOpenH
import android.util.L
//参考:http://blog.csdn.net/liuhe688/article/details/6715983
public class DatabaseHelper extends SQLiteOpenHelper// 继承SQLiteOpenHelper类
// 数据库版本号
private static final int DATABASE_VERSION = 1;
// 数据库名
private static final String DATABASE_NAME = "TestDB.db";
// 数据表名,一个数据库中可以有多个表(虽然本例中只建立了一个表)
public static final String TABLE_NAME = "PersonTable";
// 构造函数,调用父类SQLiteOpenHelper的构造函数
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version, DatabaseErrorHandler errorHandler)
super(context, name, factory, version, errorHandler);
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version)
super(context, name, factory, version);
// SQLiteOpenHelper的构造函数参数:
// context:上下文环境
// name:数据库名字
// factory:游标工厂(可选)
// version:数据库模型版本号
public DatabaseHelper(Context context)
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// 数据库实际被创建是在getWritableDatabase()或getReadableDatabase()方法调用时
Log.d(AppConstants.LOG_TAG, "DatabaseHelper Constructor");
// CursorFactory设置为null,使用系统默认的工厂类
// 继承SQLiteOpenHelper类,必须要覆写的三个方法:onCreate(),onUpgrade(),onOpen()
public void onCreate(SQLiteDatabase db)
// 调用时间:数据库第一次创建时onCreate()方法会被调用
// onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据
// 这个方法中主要完成创建数据库后对数据库的操作
Log.d(AppConstants.LOG_TAG, "DatabaseHelper onCreate");
// 构建创建表的SQL语句(可以从SQLite Expert工具的DDL粘贴过来加进StringBuffer中)
StringBuffer sBuffer = new StringBuffer();
sBuffer.append("CREATE TABLE [" + TABLE_NAME + "] (");
sBuffer.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");
sBuffer.append("[name] TEXT,");
sBuffer.append("[age] INTEGER,");
sBuffer.append("[info] TEXT)");
// 执行创建表的SQL语句
db.execSQL(sBuffer.toString());
// 即便程序修改重新运行,只要数据库已经创建过,就不会再进入这个onCreate方法
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
// 调用时间:如果DATABASE_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade
// onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号
// 这样就可以把一个数据库从旧的模型转变到新的模型
// 这个方法中主要完成更改数据库版本的操作
Log.d(AppConstants.LOG_TAG, "DatabaseHelper onUpgrade");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
// 上述做法简单来说就是,通过检查常量值来决定如何,升级时删除旧表,然后调用onCreate来创建新表
// 一般在实际项目中是不能这么做的,正确的做法是在更新数据表结构时,还要考虑用户存放于数据库中的数据不丢失
public void onOpen(SQLiteDatabase db)
super.onOpen(db);
// 每次打开数据库之后首先被执行
Log.d(AppConstants.LOG_TAG, "DatabaseHelper onOpen");
  定义一个Person类作为测试数据:
package com.example.
public class Person
public int _
public int
public Person()
public Person(String name, int age, String info)
this.name =
this.age =
this.info =
  之后是一个管理类,持有数据库对象,对各种操作进行了封装:
package com.example.
import java.util.ArrayL
import java.util.L
import android.content.ContentV
import android.content.C
import android.database.C
import android.database.sqlite.SQLiteD
import android.util.L
//参考:http://blog.csdn.net/liuhe688/article/details/6715983
public class DBManager
private DatabaseH
private SQLiteD
public DBManager(Context context)
Log.d(AppConstants.LOG_TAG, "DBManager --& Constructor");
helper = new DatabaseHelper(context);
// 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0,
// mFactory);
// 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
db = helper.getWritableDatabase();
* add persons
* @param persons
public void add(List&Person& persons)
Log.d(AppConstants.LOG_TAG, "DBManager --& add");
// 采用事务处理,确保数据完整性
db.beginTransaction(); // 开始事务
for (Person person : persons)
db.execSQL("INSERT INTO " + DatabaseHelper.TABLE_NAME
+ " VALUES(null, ?, ?, ?)", new Object[] { person.name,
person.age,
// 带两个参数的execSQL()方法,采用占位符参数?,把参数值放在后面,顺序对应
// 一个参数的execSQL()方法中,用户输入特殊字符时需要转义
// 使用占位符有效区分了这种情况
db.setTransactionSuccessful(); // 设置事务成功完成
db.endTransaction(); // 结束事务
* update person's age
* @param person
public void updateAge(Person person)
Log.d(AppConstants.LOG_TAG, "DBManager --& updateAge");
ContentValues cv = new ContentValues();
cv.put("age", person.age);
db.update(DatabaseHelper.TABLE_NAME, cv, "name = ?",
new String[] { person.name });
* delete old person
* @param person
public void deleteOldPerson(Person person)
Log.d(AppConstants.LOG_TAG, "DBManager --& deleteOldPerson");
db.delete(DatabaseHelper.TABLE_NAME, "age &= ?",
new String[] { String.valueOf(person.age) });
* query all persons, return list
* @return List&Person&
public List&Person& query()
Log.d(AppConstants.LOG_TAG, "DBManager --& query");
ArrayList&Person& persons = new ArrayList&Person&();
Cursor c = queryTheCursor();
while (c.moveToNext())
Person person = new Person();
person._id = c.getInt(c.getColumnIndex("_id"));
person.name = c.getString(c.getColumnIndex("name"));
person.age = c.getInt(c.getColumnIndex("age"));
= c.getString(c.getColumnIndex("info"));
persons.add(person);
c.close();
* query all persons, return cursor
* @return Cursor
public Cursor queryTheCursor()
Log.d(AppConstants.LOG_TAG, "DBManager --& queryTheCursor");
Cursor c = db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME,
* close database
public void closeDB()
Log.d(AppConstants.LOG_TAG, "DBManager --& closeDB");
// 释放数据库资源
db.close();
  主要的Activity:
HelloDBActivity
package com.example.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.app.A
import android.database.C
import android.database.CursorW
import android.os.B
import android.view.M
import android.view.V
import android.widget.ListV
import android.widget.SimpleA
import android.widget.SimpleCursorA
//参考:http://blog.csdn.net/liuhe688/article/details/6715983
public class HelloDBActivity extends Activity
private DBManager dbM
private ListView listV
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello_db);
listView = (ListView) findViewById(R.id.listView);
// 初始化DBManager
dbManager = new DBManager(this);
public boolean onCreateOptionsMenu(Menu menu)
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.hello_db, menu);
return true;
protected void onDestroy()
super.onDestroy();
dbManager.closeDB();// 释放数据库资源
public void add(View view)
ArrayList&Person& persons = new ArrayList&Person&();
Person person1 = new Person("Ella", 22, "lively girl");
Person person2 = new Person("Jenny", 22, "beautiful girl");
Person person3 = new Person("Jessica", 23, "sexy girl");
Person person4 = new Person("Kelly", 23, "hot baby");
Person person5 = new Person("Jane", 25, "a pretty woman");
persons.add(person1);
persons.add(person2);
persons.add(person3);
persons.add(person4);
persons.add(person5);
dbManager.add(persons);
public void update(View view)
// 把Jane的年龄改为30(注意更改的是数据库中的值,要查询才能刷新ListView中显示的结果)
Person person = new Person();
person.name = "Jane";
person.age = 30;
dbManager.updateAge(person);
public void delete(View view)
// 删除所有三十岁以上的人(此操作在update之后进行,Jane会被删除(因为她的年龄被改为30))
// 同样是查询才能查看更改结果
Person person = new Person();
person.age = 30;
dbManager.deleteOldPerson(person);
public void query(View view)
List&Person& persons = dbManager.query();
ArrayList&Map&String, String&& list = new ArrayList&Map&String, String&&();
for (Person person : persons)
HashMap&String, String& map = new HashMap&String, String&();
map.put("name", person.name);
map.put("info", person.age + " years old, " + );
list.add(map);
SimpleAdapter adapter = new SimpleAdapter(this, list,
android.R.layout.simple_list_item_2, new String[] { "name",
"info" }, new int[] { android.R.id.text1,
android.R.id.text2 });
listView.setAdapter(adapter);
@SuppressWarnings("deprecation")
public void queryTheCursor(View view)
Cursor c = dbManager.queryTheCursor();
startManagingCursor(c); // 托付给activity根据自己的生命周期去管理Cursor的生命周期
CursorWrapper cursorWrapper = new CursorWrapper(c)
public String getString(int columnIndex)
// 将简介前加上年龄
if (getColumnName(columnIndex).equals("info"))
int age = getInt(getColumnIndex("age"));
return age + " years old, " + super.getString(columnIndex);
return super.getString(columnIndex);
// 确保查询结果中有"_id"列
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2, cursorWrapper,
new String[] { "name", "info" }, new int[] {
android.R.id.text1, android.R.id.text2 });
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
  另,附上布局和其他:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" &
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="add" /&
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="update"
android:text="update" /&
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="delete" /&
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="query"
android:text="query" /&
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="queryTheCursor"
android:text="queryTheCursor" /&
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&
&/LinearLayout&
package com.example.
public class AppConstants
public static final String LOG_TAG="Hello DB";
  官网Training: Saving Data in SQL Databases
  Android中SQLite应用详解:
  关于Cursor类的介绍:
  Android 小项目之--SQLite 使用法门 (附源码):
阅读(...) 评论()

我要回帖

更多关于 刁桂华的肝胆朋友 的文章

 

随机推荐