朋友圈里的每一个消息体里面的数据,当下拉刷新从服务器下载数据包后,存入sqlite:用户名、图片url、点赞、评论等等。上拉加载的时候,从数据库里取出最近的5条数据加载到朋友圈上。

Android通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。

SQLIte数据库不像其他数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到了广泛应用。Android也没有重复发明“轮子”,而是直接使用了SQLite数据库。

1、SQLiteDatabase

Android提供了创建和使用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有个sqlite3工具,我们可以使用它来创建数据库、创建表和执行一些SQL语句。

SQLiteDatabase常用方法

方法名称 方法描述

openOrCreateDatabase(String path,

SQLiteDatabase.CursorFactory factory)

打开或创建数据库
insert(Sting table,String nullColumnHack,ContentValues values) 添加一条记录
delete(String table,String whereClause,String[] whereArgs) 删除一条记录

query(String table,String[] columns,String selection,String[] selectionArgs,

String groupBy,String having,String orderBy)

查询记录
update(String table,ContentValues values,String whereClause,String[] whereArgs) 修改记录
execSQL(String sql) 执行一条SQL语句
close() 关闭数据库

1)、打开或者创建数据库

可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)打开或创建一个数据库,该方法的第一个参数是数据库创建路径,注意这个路径一定是数据库全路径。例如:/data/data/package/database/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。

  1. SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);
  1. SQLiteDatabase.openOrCreateDatabase("/data/data/mx.android.ch09/database/temp.db", null);

2)、创建表

首先编写创建表的SQL语句,然后调用SQLiteDatabase的execSQL()方法。

  1. public void createTable(SQLiteDatabase db){
  2. //创建SQL语句
  3. String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
  4. //执行SQL语句
  5. db.execSQL(sql);
  6. }
  1. public void createTable(SQLiteDatabase db){
  2. //创建SQL语句
  3. String sql = "create table UserTbl(_id integer primary key autoincrement,username text,password text)";
  4. //执行SQL语句
  5. db.execSQL(sql);
  6. }

3)、插入数据

有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数的空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;另一种方法是编写插入数据的SQL语句、直接调用SQLiteDatabase的execSQL()方法来执行。

  1. public void insert1(SQLiteDatabase db){
  2. String sql = "insert into UserTbl(username,password) values ('mx','123')";
  3. db.execSQL(sql);
  4. }
  1. public void insert1(SQLiteDatabase db){
  2. String sql = "insert into UserTbl(username,password) values ('mx','123')";
  3. db.execSQL(sql);
  4. }
  1. public void insert2(SQLiteDatabase db){
  2. //实例化常量值
  3. ContentValues cv = new ContentValues();
  4. cv.put("username","mx");
  5. cv.put("password", "123");
  6. db.insert("UserTbl",null, cv);
  7. }
  1. public void insert2(SQLiteDatabase db){
  2. //实例化常量值
  3. ContentValues cv = new ContentValues();
  4. cv.put("username","mx");
  5. cv.put("password", "123");
  6. db.insert("UserTbl",null, cv);
  7. }

4)、删除数据

有两种方法:一种的调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数的删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。

  1. public void delete1(SQLiteDatabase db){
  2. String sql = "delete from UserTbl where _id = 1";
  3. db.execSQL(sql);
  4. }
  1. public void delete1(SQLiteDatabase db){
  2. String sql = "delete from UserTbl where _id = 1";
  3. db.execSQL(sql);
  4. }
  1. public void delete2(SQLiteDatabase db){
  2. String whereClause = "_id=?";
  3. String[] whereArgs = {String.valueOf(1)};
  4. db.delete("UserTbl", whereClause, whereArgs);
  5. }
  1. public void delete2(SQLiteDatabase db){
  2. String whereClause = "_id=?";
  3. String[] whereArgs = {String.valueOf(1)};
  4. db.delete("UserTbl", whereClause, whereArgs);
  5. }

5)、查询数据

下面看一个查询方法。

  1. public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
  2. String groupBy,String having,String orderBy,String limit)。
  1. public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,
  2. String groupBy,String having,String orderBy,String limit)。

各个参数的意义说明如下:

  • table:表名称
  • columns:列名称数组
  • selection:条件子句,相当于where
  • selectionArgs:条件子句,参数数组
  • groupBy:分组列
  • having:分组条件
  • orderBy:排序列
  • limit:分页查询限制
  • Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move()、获得列值方法getString()等。

Cursor游标常用方法

方法名称 方法描述
getCount() 总记录条数
isFirst() 判断是否是第一条记录
isLast() 判断是否是最后一条记录
moveToFirst() 移动到第一条记录
moveToLast() 移动到最后一条记录
move(int offset) 移动到指定记录
moveToNext() 移动到下一条记录
moveToPrevision() 移动到上一条记录
getColumnIndexOrThrow(String columnName) 根据列名获得列索引
getInt(int columnIndex) 获得指定列索引的int类型值
getString(int columnIndex) 获得指定列索引的String类型值

下面代码演示了如何查询数据记录。

  1. public void query(SQLiteDatabase db){
  2. //查询获得游标
  3. Cursor c = db.query("UserTbl", null, null, null, null, null, null);
  4. //判断游标是否为空
  5. if(c.moveToFirst()){
  6. //遍历游标
  7. for (int i = 0; i < c.getCount(); i++) {
  8. c.move(i);
  9. //获得Id
  10. int id = c.getInt(0);
  11. //获得用户名
  12. String username = c.getString(1);
  13. //获得密码
  14. String passwrod = c.getString(2);
  15. //输出用户信息
  16. System.out.println(id + ":" + username + ":" + passwrod);
  17. }
  18. }
  19. }
  1. public void query(SQLiteDatabase db){
  2. //查询获得游标
  3. Cursor c = db.query("UserTbl", null, null, null, null, null, null);
  4. //判断游标是否为空
  5. if(c.moveToFirst()){
  6. //遍历游标
  7. for (int i = 0; i < c.getCount(); i++) {
  8. c.move(i);
  9. //获得Id
  10. int id = c.getInt(0);
  11. //获得用户名
  12. String username = c.getString(1);
  13. //获得密码
  14. String passwrod = c.getString(2);
  15. //输出用户信息
  16. System.out.println(id + ":" + username + ":" + passwrod);
  17. }
  18. }
  19. }

6)、修改数据

有两种方式:一种是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause,String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更新列ContentValues类型的键-值对(Map),第三个参数是更新条件(where子句),第四个参数是更新条件的值数组。二是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。

  1. public void update1(SQLiteDatabase db){
  2. String sql = "update UserTbl set password = 321 where _id = 1";
  3. db.execSQL(sql);
  4. }
  5. public void update2(SQLiteDatabase db){
  6. ContentValues values = new ContentValues();
  7. values.put("password", "321");
  8. String whereClause = "_id=?";
  9. String[] whereArgs = {String.valueOf(1)};
  10. db.update("UserTbl", values, whereClause, whereArgs);
  11. }
  1. public void update1(SQLiteDatabase db){
  2. String sql = "update UserTbl set password = 321 where _id = 1";
  3. db.execSQL(sql);
  4. }
  5. public void update2(SQLiteDatabase db){
  6. ContentValues values = new ContentValues();
  7. values.put("password", "321");
  8. String whereClause = "_id=?";
  9. String[] whereArgs = {String.valueOf(1)};
  10. db.update("UserTbl", values, whereClause, whereArgs);
  11. }

2、SQLiteOpenHelper

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新。一般的用法是定义一个类继承之,并实现其两个抽线方法onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。

SQLiteOpenHelper常用方法

方法名称 方法描述

SQLiteOpenHelper(Context context,String name,

SQLiteDatabase.CursorFactory factory,int version)

构造方法,一般是传递一个要创建的

数据库名称name参数

onCreate(SQLiteDatabase db) 创建数据库调用

onUpgrade(SQLiteDatabase db,

int oldVersion, int newVersion)

版本更新调用
getReadableDatabase() 创建或打开一个只读数据库
getWritableDatabase() 创建或打开一个读写数据库

下面的代码演示了通过继承SQLiteOpenHelper来实现创建数据库、创建表、插入数据和查询数据的过程。

  1. public class TestSQLiteActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.sqlite);
  6. //实例化数据库帮助类
  7. MyDBHelper helper = new MyDBHelper(this);
  8. //插入
  9. helper.insert();
  10. //查询
  11. helper.query();
  12. }
  13. //数据库帮助类
  14. class MyDBHelper extends SQLiteOpenHelper{
  15. //创建SQL语句
  16. private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
  17. //SQLiteDatabase实例
  18. private SQLiteDatabase db;
  19. //构造方法
  20. public MyDBHelper(Context c) {
  21. super(c, "test.db", null, 2);
  22. }
  23. @Override
  24. public void onCreate(SQLiteDatabase db) {
  25. //创建表
  26. db.execSQL(CREATE_TABLE_SQL);
  27. }
  28. @Override
  29. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  30. }
  31. //插入方法
  32. private void insert(){
  33. //插入SQL语句
  34. String sql = "insert into TempTb1(_id,name) values(1,'mx')";
  35. //执行插入
  36. getWritableDatabase().execSQL(sql);
  37. }
  38. //查询方法
  39. private void query(){
  40. //获得查询游标
  41. Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null);
  42. //判断游标是否为空
  43. if(c.moveToFirst()){
  44. //遍历游标
  45. for (int i = 0; i < c.getCount(); i++) {
  46. c.move(i);
  47. int id = c.getInt(0);
  48. String name = c.getString(1);
  49. System.out.println(id + ":" + name);
  50. }
  51. }
  52. }
  53. }
  54. }
  1. public class TestSQLiteActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.sqlite);
  6. //实例化数据库帮助类
  7. MyDBHelper helper = new MyDBHelper(this);
  8. //插入
  9. helper.insert();
  10. //查询
  11. helper.query();
  12. }
  13. //数据库帮助类
  14. class MyDBHelper extends SQLiteOpenHelper{
  15. //创建SQL语句
  16. private static final String CREATE_TABLE_SQL = "create table TempTb1(_id integer,name text)";
  17. //SQLiteDatabase实例
  18. private SQLiteDatabase db;
  19. //构造方法
  20. public MyDBHelper(Context c) {
  21. super(c, "test.db", null, 2);
  22. }
  23. @Override
  24. public void onCreate(SQLiteDatabase db) {
  25. //创建表
  26. db.execSQL(CREATE_TABLE_SQL);
  27. }
  28. @Override
  29. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  30. }
  31. //插入方法
  32. private void insert(){
  33. //插入SQL语句
  34. String sql = "insert into TempTb1(_id,name) values(1,'mx')";
  35. //执行插入
  36. getWritableDatabase().execSQL(sql);
  37. }
  38. //查询方法
  39. private void query(){
  40. //获得查询游标
  41. Cursor c = getWritableDatabase().query("TempTb1", null, null, null, null, null, null);
  42. //判断游标是否为空
  43. if(c.moveToFirst()){
  44. //遍历游标
  45. for (int i = 0; i < c.getCount(); i++) {
  46. c.move(i);
  47. int id = c.getInt(0);
  48. String name = c.getString(1);
  49. System.out.println(id + ":" + name);
  50. }
  51. }
  52. }
  53. }
  54. }

3、SQLite应用实例——收藏管理

通过使用SQLite对自己比较喜欢的网站进行收藏管理。收藏信息包括编号、网站名称、URL和网站内容描述,可以实现的功能有添加、删除和浏览等。

1)、创建操作数据库的工具类DBHelper,该类继承SQLiteOpenHelper。覆盖onCreate()和onUpgrade()方法,并添加inisert()、del()、query()方法,分别用来添加、删除和查询数据。

  1. public class DBHelper extends SQLiteOpenHelper {
  2. //数据库名称
  3. private static final String DB_NAME = "coll.db";
  4. //表名称
  5. private static final String TBL_NAME = "CollTbl";
  6. //创建表SQL语句
  7. private static final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
  8. "autoincrement,name text,url text,desc text)";
  9. //SQLiteDatabase实例
  10. private SQLiteDatabase db;
  11. //构造方法
  12. public DBHelper(Context c) {
  13. super(c, DB_NAME, null, 2);
  14. }
  15. //创建表
  16. @Override
  17. public void onCreate(SQLiteDatabase db) {
  18. this.db = db;
  19. db.execSQL(CREATE_TBL);
  20. }
  21. //插入方法
  22. public void insert(ContentValues values){
  23. //获得SQLiteDatabase实例
  24. SQLiteDatabase db = getWritableDatabase();
  25. //插入
  26. db.insert(TBL_NAME, null, values);
  27. db.close();
  28. }
  29. //查询方法
  30. public Cursor query(){
  31. //获得SQLiteDatabase实例
  32. SQLiteDatabase db = getWritableDatabase();
  33. //查询获得Cursor
  34. Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
  35. return c;
  36. }
  37. //删除方法
  38. public void delete(int id){
  39. if(db == null)
  40. db = getWritableDatabase();
  41. db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
  42. }
  43. //关闭数据库
  44. public void close(){
  45. if(db != null)
  46. db.close();
  47. }
  48. @Override
  49. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  50. }
  51. }
  1. public class DBHelper extends SQLiteOpenHelper {
  2. //数据库名称
  3. private static final String DB_NAME = "coll.db";
  4. //表名称
  5. private static final String TBL_NAME = "CollTbl";
  6. //创建表SQL语句
  7. private static final String CREATE_TBL = "create table CollTbl(_id integer primary key " +
  8. "autoincrement,name text,url text,desc text)";
  9. //SQLiteDatabase实例
  10. private SQLiteDatabase db;
  11. //构造方法
  12. public DBHelper(Context c) {
  13. super(c, DB_NAME, null, 2);
  14. }
  15. //创建表
  16. @Override
  17. public void onCreate(SQLiteDatabase db) {
  18. this.db = db;
  19. db.execSQL(CREATE_TBL);
  20. }
  21. //插入方法
  22. public void insert(ContentValues values){
  23. //获得SQLiteDatabase实例
  24. SQLiteDatabase db = getWritableDatabase();
  25. //插入
  26. db.insert(TBL_NAME, null, values);
  27. db.close();
  28. }
  29. //查询方法
  30. public Cursor query(){
  31. //获得SQLiteDatabase实例
  32. SQLiteDatabase db = getWritableDatabase();
  33. //查询获得Cursor
  34. Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
  35. return c;
  36. }
  37. //删除方法
  38. public void delete(int id){
  39. if(db == null)
  40. db = getWritableDatabase();
  41. db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
  42. }
  43. //关闭数据库
  44. public void close(){
  45. if(db != null)
  46. db.close();
  47. }
  48. @Override
  49. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  50. }
  51. }

2)、创建视图布局文件add.xml,在其中添加三个TextView和三个EditText,分别用来输入网站名称、URL和网站描述信息,一个Button响应单击事件,当用户单击时将信息保存到数据库中。

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. android:orientation="vertical" android:layout_gravity="center_vertical" >
  4. <TextView
  5. android:text="网站名称"
  6. android:id="@+id/s_TextView01"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content" />
  9. <EditText
  10. android:text=""
  11. android:id="@+id/s_EditTextName"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content" />
  14. <TextView
  15. android:text="URL"
  16. android:id="@+id/s_TextView02"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content" />
  19. <EditText
  20. android:text=""
  21. android:id="@+id/s_EditTextURL"
  22. android:layout_width="fill_parent"
  23. android:layout_height="wrap_content" />
  24. <TextView
  25. android:text="网站描述"
  26. android:id="@+id/s_TextView03"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content" />
  29. <EditText
  30. android:text=""
  31. android:id="@+id/s_EditTextDesc"
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content" />
  34. <Button
  35. android:text="添加"
  36. android:id="@+id/s_ButtonAdd"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content" />
  39. </LinearLayout>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. android:orientation="vertical" android:layout_gravity="center_vertical" >
  4. <TextView
  5. android:text="网站名称"
  6. android:id="@+id/s_TextView01"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content" />
  9. <EditText
  10. android:text=""
  11. android:id="@+id/s_EditTextName"
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content" />
  14. <TextView
  15. android:text="URL"
  16. android:id="@+id/s_TextView02"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content" />
  19. <EditText
  20. android:text=""
  21. android:id="@+id/s_EditTextURL"
  22. android:layout_width="fill_parent"
  23. android:layout_height="wrap_content" />
  24. <TextView
  25. android:text="网站描述"
  26. android:id="@+id/s_TextView03"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content" />
  29. <EditText
  30. android:text=""
  31. android:id="@+id/s_EditTextDesc"
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content" />
  34. <Button
  35. android:text="添加"
  36. android:id="@+id/s_ButtonAdd"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content" />
  39. </LinearLayout>

3)、创建AddActivity,声明用到的组件类EditText和Button,在onCreate()方法中进行初始化,响应Button的单击事件方法,该方法从编辑框中获得数据项,封装到ContentValues对象中,调用DBHelper进行保存,之后跳转到显示收藏记录QueryActivity界面。

  1. public class AddActivity extends Activity {
  2. //声明EditText实例
  3. private EditText et1,et2,et3;
  4. //声明Button实例
  5. private Button b1;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.add);
  10. this.setTitle("添加收藏信息");
  11. et1 = (EditText) findViewById(R.id.s_EditTextName);
  12. et2 = (EditText) findViewById(R.id.s_EditTextURL);
  13. et3 = (EditText) findViewById(R.id.s_EditTextDesc);
  14. b1 = (Button) findViewById(R.id.s_ButtonAdd);
  15. b1.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View arg0) {
  18. String name = et1.getText().toString();
  19. String url = et2.getText().toString();
  20. String desc = et3.getText().toString();
  21. //内容值实例
  22. ContentValues values = new ContentValues();
  23. values.put("name", name);
  24. values.put("url", url);
  25. values.put("desc", desc);
  26. //实例化数据库帮助类
  27. DBHelper helper = new DBHelper(getApplicationContext());
  28. //插入数据
  29. helper.insert(values);
  30. //实例化Intent
  31. Intent intent = new Intent(AddActivity.this,QueryActivity.class);
  32. startActivity(intent);
  33. }
  34. });
  35. }
  36. }
  1. public class AddActivity extends Activity {
  2. //声明EditText实例
  3. private EditText et1,et2,et3;
  4. //声明Button实例
  5. private Button b1;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.add);
  10. this.setTitle("添加收藏信息");
  11. et1 = (EditText) findViewById(R.id.s_EditTextName);
  12. et2 = (EditText) findViewById(R.id.s_EditTextURL);
  13. et3 = (EditText) findViewById(R.id.s_EditTextDesc);
  14. b1 = (Button) findViewById(R.id.s_ButtonAdd);
  15. b1.setOnClickListener(new OnClickListener() {
  16. @Override
  17. public void onClick(View arg0) {
  18. String name = et1.getText().toString();
  19. String url = et2.getText().toString();
  20. String desc = et3.getText().toString();
  21. //内容值实例
  22. ContentValues values = new ContentValues();
  23. values.put("name", name);
  24. values.put("url", url);
  25. values.put("desc", desc);
  26. //实例化数据库帮助类
  27. DBHelper helper = new DBHelper(getApplicationContext());
  28. //插入数据
  29. helper.insert(values);
  30. //实例化Intent
  31. Intent intent = new Intent(AddActivity.this,QueryActivity.class);
  32. startActivity(intent);
  33. }
  34. });
  35. }
  36. }

4)、创建显示记录QueryActivity。该类继承ListActivity,将从数据库查询的记录通过ListView显示在列表中。并且当用户点击某条记录时,通过对话框提示用户是否删除此记录。

row.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. android:orientation="horizontal" android:layout_gravity="center_vertical" >
  4. <TextView
  5. android:id="@+id/r_text0"
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:paddingRight="10px" />
  9. <TextView
  10. android:id="@+id/r_text1"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:paddingRight="10px" />
  14. <TextView
  15. android:id="@+id/r_text2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:paddingRight="10px" />
  19. <TextView
  20. android:id="@+id/r_text3"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:paddingLeft="10px" />
  24. </LinearLayout>
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent" android:layout_height="fill_parent"
  3. android:orientation="horizontal" android:layout_gravity="center_vertical" >
  4. <TextView
  5. android:id="@+id/r_text0"
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:paddingRight="10px" />
  9. <TextView
  10. android:id="@+id/r_text1"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:paddingRight="10px" />
  14. <TextView
  15. android:id="@+id/r_text2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:paddingRight="10px" />
  19. <TextView
  20. android:id="@+id/r_text3"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:paddingLeft="10px" />
  24. </LinearLayout>
      1. public class QueryActivity extends ListActivity {
      2. @Override
      3. protected void onCreate(Bundle savedInstanceState) {
      4. super.onCreate(savedInstanceState);
      5. setContentView(R.layout.row);
      6. this.setTitle("浏览收藏信息");
      7. //实例化数据库帮助类
      8. final DBHelper helper = new DBHelper(this);
      9. //查询获得游标
      10. Cursor c = helper.query();
      11. //列表项数组
      12. String[] from = {"_id","name","url","desc"};
      13. //列表项ID
      14. int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
      15. //适配器
      16. SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row,c,from,to);
      17. //列表视图
      18. ListView listView = getListView();
      19. //为列表视图添加适配器
      20. listView.setAdapter(adapter);
      21. //提示对话框
      22. final AlertDialog.Builder builder = new AlertDialog.Builder(this);
      23. //为ListView设置单击监听器
      24. listView.setOnItemClickListener(new OnItemClickListener() {
      25. @Override
      26. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
      27. long arg3) {
      28. final long temp = arg3;
      29. builder.setMessage("真的要删除该记录吗?").setPositiveButton("是", new DialogInterface.OnClickListener() {
      30. @Override
      31. public void onClick(DialogInterface dialog, int which) {
      32. //删除数据
      33. helper.delete((int)temp);
      34. //重新查询
      35. Cursor c = helper.query();
      36. String[] from = {"_id","name","url","desc"};
      37. int[] to = {R.id.r_text0,R.id.r_text1,R.id.r_text2,R.id.r_text3};
      38. SimpleCursorAdapter adapter = newSimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
      39. ListView listView = getListView();
      40. listView.setAdapter(adapter);
      41. }
      42. }).setNegativeButton("否", new DialogInterface.OnClickListener() {
      43. @Override
      44. public void onClick(DialogInterface dialog, int which) {
      45. }
      46. });
      47. //创建提示对话框
      48. AlertDialog ad = builder.create();
      49. ad.show();
      50. }
      51. });

        helper.close();
        }
        }
        原帖地址:

http://blog.csdn.net/rookieding/article/details/7430851

4、安卓数据存储——sqlite的更多相关文章

  1. 安卓数据存储(3):SQLite数据库存储

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

  2. 1、安卓数据存储机制——sharedPreference

    项目中用到的数据存储方式: 1.这个项目里的“个人标签“.”个性签名“页面的文字存储——sharedPreference:我们项目中用到的Preference来保存用户编辑的标签.签名内容,并支持用户 ...

  3. 安卓数据存储(2):SharedPreferences

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)在读取数据时可以通过这个键把相应的值取出 ...

  4. Unity本地数据存储---Sqlite和JSON

    2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...

  5. 数据存储--sqlite总结

    SQLite SQLite(轻量级的数据库,关系型数据库) 辅助工具:Navicat Premium 等 原理:ios针对存储问题封装了sqlite数据库(c语言数据库). 1 app获取沙盒地址命名 ...

  6. Android数据存储——SQLite数据库(模板)

    本篇整合Android使用数据库,要保存一个实体类的样本. 首先看一下数据库语句: ORM:关系对象映射 添加数据: ContentValues values = new ContentValues( ...

  7. Android笔记(四十四) Android中的数据存储——SQLite(六)整合

    实现注册.登录.注销账户 MainActivity.java package cn.lixyz.activity; import android.app.Activity; import androi ...

  8. Android笔记(四十三) Android中的数据存储——SQLite(五)delete

    SQLite通过delete()方法删除数据 delete()方法参数说明: delete()方法参数 对应sql部分 描述 table delte from table_name 要删除的表 whe ...

  9. Android笔记(四十二) Android中的数据存储——SQLite(四)update

    update方法的四个参数: update()方法参数 对应的sql部分 描述 table update table_name 更新的表名 values set column=xxx ContentV ...

随机推荐

  1. 用phpstudy搭建dedecms网站验证码出不来解决方案

    验证码图片不显示,这应该是很多站长朋友们最长遇到的一个问题,本地测试明明好好的,为什么传上空间或者服务器上验证码就无法显示了呢,春哥分析这可能是由于没有加载gd库扩展所引起的,那么怎么解决呢?由于引起 ...

  2. boost之词法解析器spirit

    摘要:解析器就是编译原理中的语言的词法分析器,可以按照文法规则提取字符或者单词.功能:接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理. C++ 程序员需要 ...

  3. Linux 部署 Tomcat和JDK

    一:安装jdk下载将jdk加压后放到/usr/local目录下: [root@master ~]#chmod 755 jdk-6u5-linux-x64.bin [root@master ~]# ./ ...

  4. Android 下得到 未安装APK包含信息 等

    很多情况下,我们需要通过APK文件来得到它的一些信息. (此时此APK不一定被安装了) 0. 基础知识:可以通过android.content.Context的方法 getPackageManager ...

  5. cakephp 的query方法,直接写在controller中是否 有点不合适

    模型的query()函数有时是非常实用的,它可以在任何需要数据的地方执行SQL语句.但不是在什么地方调用query()方法都是恰当的.特别是在控制器中直接调用模型的query()方法 $this-&g ...

  6. JAVA List<T> 如何初始化

    通常用法:List<类型> list=new ArrayList<类型>();List是一个接口,不可实例化,通过实例化其实现类来使用List集合,他的最常用实现类ArrayL ...

  7. conflicting types for xxxx错误 (转)

    pretty_print.c:31: error: conflicting types for ‘vmi_print_hex’ libvmi.h:749: note: previous declara ...

  8. (转)MultipleOutputFormat和MultipleOutputs

    MultipleOutputFormat和MultipleOutputs http://www.cnblogs.com/liangzh/archive/2012/05/22/2512264.html ...

  9. 关于源码编译每次提示有错误 要make update-api

    最近编译newline的版本的时候..同事修改了andoid默认输入法为百度.这是系统自动提供的API,所以每次编译会提示 此时在编译源码生成SDK的过程中会出现这个问题:************** ...

  10. FIR滤波器的实现方法(转)

    源:http://blog.sina.com.cn/s/blog_493520900102uy26.html 内容来自于上篇博文,第七章,FIR滤波器 http://blog.sina.com.cn/ ...