重点掌握execSQL()和rawQuery()方法,rawQuery()方法用于执行select语句。

SQLiteOpenHelper,实现了onCreate和onUpgrade方法。

第一次创建之后接着会调用onCreate方法(我们在这里创建了数据表),之后onCreate就不再被调用。

DatabaseHelper类:

  1. package com.example.hellodatabases;
  2.  
  3. import android.content.Context;
  4. import android.database.DatabaseErrorHandler;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  7. import android.database.sqlite.SQLiteOpenHelper;
  8. import android.util.Log;
  9.  
  10. //参考:http://blog.csdn.net/liuhe688/article/details/6715983
  11.  
  12. public class DatabaseHelper extends SQLiteOpenHelper// 继承SQLiteOpenHelper类
  13. {
  14.  
  15. // 数据库版本号
  16. private static final int DATABASE_VERSION = ;
  17. // 数据库名
  18. private static final String DATABASE_NAME = "TestDB.db";
  19.  
  20. // 数据表名,一个数据库中可以有多个表(虽然本例中只建立了一个表)
  21. public static final String TABLE_NAME = "PersonTable";
  22.  
  23. // 构造函数,调用父类SQLiteOpenHelper的构造函数
  24. public DatabaseHelper(Context context, String name, CursorFactory factory,
  25. int version, DatabaseErrorHandler errorHandler)
  26. {
  27. super(context, name, factory, version, errorHandler);
  28.  
  29. }
  30.  
  31. public DatabaseHelper(Context context, String name, CursorFactory factory,
  32. int version)
  33. {
  34. super(context, name, factory, version);
  35. // SQLiteOpenHelper的构造函数参数:
  36. // context:上下文环境
  37. // name:数据库名字
  38. // factory:游标工厂(可选)
  39. // version:数据库模型版本号
  40. }
  41.  
  42. public DatabaseHelper(Context context)
  43. {
  44. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  45.  
  46. // 数据库实际被创建是在getWritableDatabase()或getReadableDatabase()方法调用时
  47. Log.d(AppConstants.LOG_TAG, "DatabaseHelper Constructor");
  48. // CursorFactory设置为null,使用系统默认的工厂类
  49. }
  50.  
  51. // 继承SQLiteOpenHelper类,必须要覆写的三个方法:onCreate(),onUpgrade(),onOpen()
  52. @Override
  53. public void onCreate(SQLiteDatabase db)
  54. {
  55. // 调用时间:数据库第一次创建时onCreate()方法会被调用
  56.  
  57. // onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据
  58. // 这个方法中主要完成创建数据库后对数据库的操作
  59.  
  60. Log.d(AppConstants.LOG_TAG, "DatabaseHelper onCreate");
  61.  
  62. // 构建创建表的SQL语句(可以从SQLite Expert工具的DDL粘贴过来加进StringBuffer中)
  63. StringBuffer sBuffer = new StringBuffer();
  64.  
  65. sBuffer.append("CREATE TABLE [" + TABLE_NAME + "] (");
  66. sBuffer.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ");
  67. sBuffer.append("[name] TEXT,");
  68. sBuffer.append("[age] INTEGER,");
  69. sBuffer.append("[info] TEXT)");
  70.  
  71. // 执行创建表的SQL语句
  72. db.execSQL(sBuffer.toString());
  73.  
  74. // 即便程序修改重新运行,只要数据库已经创建过,就不会再进入这个onCreate方法
  75.  
  76. }
  77.  
  78. @Override
  79. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  80. {
  81. // 调用时间:如果DATABASE_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade
  82.  
  83. // onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号
  84. // 这样就可以把一个数据库从旧的模型转变到新的模型
  85. // 这个方法中主要完成更改数据库版本的操作
  86.  
  87. Log.d(AppConstants.LOG_TAG, "DatabaseHelper onUpgrade");
  88.  
  89. db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
  90. onCreate(db);
  91. // 上述做法简单来说就是,通过检查常量值来决定如何,升级时删除旧表,然后调用onCreate来创建新表
  92. // 一般在实际项目中是不能这么做的,正确的做法是在更新数据表结构时,还要考虑用户存放于数据库中的数据不丢失
  93.  
  94. }
  95.  
  96. @Override
  97. public void onOpen(SQLiteDatabase db)
  98. {
  99. super.onOpen(db);
  100. // 每次打开数据库之后首先被执行
  101.  
  102. Log.d(AppConstants.LOG_TAG, "DatabaseHelper onOpen");
  103. }
  104.  
  105. }

Person类:

  1. package com.example.hellodatabases;
  2.  
  3. public class Person
  4. {
  5. public int _id;
  6. public String name;
  7. public int age;
  8. public String info;
  9.  
  10. public Person()
  11. {
  12. }
  13.  
  14. public Person(String name, int age, String info)
  15. {
  16. this.name = name;
  17. this.age = age;
  18. this.info = info;
  19. }
  20.  
  21. }

管理类DBManager:

  1. package com.example.hellodatabases;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.content.ContentValues;
  7. import android.content.Context;
  8. import android.database.Cursor;
  9. import android.database.sqlite.SQLiteDatabase;
  10. import android.util.Log;
  11.  
  12. //参考:http://blog.csdn.net/liuhe688/article/details/6715983
  13. public class DBManager
  14. {
  15. private DatabaseHelper helper;
  16. private SQLiteDatabase db;
  17.  
  18. public DBManager(Context context)
  19. {
  20. Log.d(AppConstants.LOG_TAG, "DBManager --> Constructor");
  21. helper = new DatabaseHelper(context);
  22. // 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0,
  23. // mFactory);
  24. // 所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
  25. db = helper.getWritableDatabase();
  26. }
  27.  
  28. /**
  29. * add persons
  30. *
  31. * @param persons
  32. */
  33. public void add(List<Person> persons)
  34. {
  35. Log.d(AppConstants.LOG_TAG, "DBManager --> add");
  36. // 采用事务处理,确保数据完整性
  37. db.beginTransaction(); // 开始事务
  38. try
  39. {
  40. for (Person person : persons)
  41. {
  42. db.execSQL("INSERT INTO " + DatabaseHelper.TABLE_NAME
  43. + " VALUES(null, ?, ?, ?)", new Object[] { person.name,
  44. person.age, person.info });
  45. // 带两个参数的execSQL()方法,采用占位符参数?,把参数值放在后面,顺序对应
  46. // 一个参数的execSQL()方法中,用户输入特殊字符时需要转义
  47. // 使用占位符有效区分了这种情况
  48. }
  49. db.setTransactionSuccessful(); // 设置事务成功完成
  50. }
  51. finally
  52. {
  53. db.endTransaction(); // 结束事务
  54. }
  55. }
  56.  
  57. /**
  58. * update person's age
  59. *
  60. * @param person
  61. */
  62. public void updateAge(Person person)
  63. {
  64. Log.d(AppConstants.LOG_TAG, "DBManager --> updateAge");
  65. ContentValues cv = new ContentValues();
  66. cv.put("age", person.age);
  67. db.update(DatabaseHelper.TABLE_NAME, cv, "name = ?",
  68. new String[] { person.name });
  69. }
  70.  
  71. /**
  72. * delete old person
  73. *
  74. * @param person
  75. */
  76. public void deleteOldPerson(Person person)
  77. {
  78. Log.d(AppConstants.LOG_TAG, "DBManager --> deleteOldPerson");
  79. db.delete(DatabaseHelper.TABLE_NAME, "age >= ?",
  80. new String[] { String.valueOf(person.age) });
  81. }
  82.  
  83. /**
  84. * query all persons, return list
  85. *
  86. * @return List<Person>
  87. */
  88. public List<Person> query()
  89. {
  90. Log.d(AppConstants.LOG_TAG, "DBManager --> query");
  91. ArrayList<Person> persons = new ArrayList<Person>();
  92. Cursor c = queryTheCursor();
  93. while (c.moveToNext())
  94. {
  95. Person person = new Person();
  96. person._id = c.getInt(c.getColumnIndex("_id"));
  97. person.name = c.getString(c.getColumnIndex("name"));
  98. person.age = c.getInt(c.getColumnIndex("age"));
  99. person.info = c.getString(c.getColumnIndex("info"));
  100. persons.add(person);
  101. }
  102. c.close();
  103. return persons;
  104. }
  105.  
  106. /**
  107. * query all persons, return cursor
  108. *
  109. * @return Cursor
  110. */
  111. public Cursor queryTheCursor()
  112. {
  113. Log.d(AppConstants.LOG_TAG, "DBManager --> queryTheCursor");
  114. Cursor c = db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME,
  115. null);
  116. return c;
  117. }
  118.  
  119. /**
  120. * close database
  121. */
  122. public void closeDB()
  123. {
  124. Log.d(AppConstants.LOG_TAG, "DBManager --> closeDB");
  125. // 释放数据库资源
  126. db.close();
  127. }
  128.  
  129. }

Activity:

  1. HelloDBActivity
  2.  
  3. package com.example.hellodatabases;
  4.  
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9.  
  10. import android.app.Activity;
  11. import android.database.Cursor;
  12. import android.database.CursorWrapper;
  13. import android.os.Bundle;
  14. import android.view.Menu;
  15. import android.view.View;
  16. import android.widget.ListView;
  17. import android.widget.SimpleAdapter;
  18. import android.widget.SimpleCursorAdapter;
  19.  
  20. //参考:http://blog.csdn.net/liuhe688/article/details/6715983
  21.  
  22. public class HelloDBActivity extends Activity
  23. {
  24. private DBManager dbManager;
  25. private ListView listView;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState)
  29. {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_hello_db);
  32.  
  33. listView = (ListView) findViewById(R.id.listView);
  34. // 初始化DBManager
  35. dbManager = new DBManager(this);
  36.  
  37. }
  38.  
  39. @Override
  40. public boolean onCreateOptionsMenu(Menu menu)
  41. {
  42. // Inflate the menu; this adds items to the action bar if it is present.
  43. getMenuInflater().inflate(R.menu.hello_db, menu);
  44. return true;
  45. }
  46.  
  47. @Override
  48. protected void onDestroy()
  49. {
  50. super.onDestroy();
  51. dbManager.closeDB();// 释放数据库资源
  52. }
  53.  
  54. public void add(View view)
  55. {
  56. ArrayList<Person> persons = new ArrayList<Person>();
  57.  
  58. Person person1 = new Person("Ella", , "lively girl");
  59. Person person2 = new Person("Jenny", , "beautiful girl");
  60. Person person3 = new Person("Jessica", , "sexy girl");
  61. Person person4 = new Person("Kelly", , "hot baby");
  62. Person person5 = new Person("Jane", , "a pretty woman");
  63.  
  64. persons.add(person1);
  65. persons.add(person2);
  66. persons.add(person3);
  67. persons.add(person4);
  68. persons.add(person5);
  69.  
  70. dbManager.add(persons);
  71. }
  72.  
  73. public void update(View view)
  74. {
  75. // 把Jane的年龄改为30(注意更改的是数据库中的值,要查询才能刷新ListView中显示的结果)
  76. Person person = new Person();
  77. person.name = "Jane";
  78. person.age = ;
  79. dbManager.updateAge(person);
  80. }
  81.  
  82. public void delete(View view)
  83. {
  84. // 删除所有三十岁以上的人(此操作在update之后进行,Jane会被删除(因为她的年龄被改为30))
  85. // 同样是查询才能查看更改结果
  86. Person person = new Person();
  87. person.age = ;
  88. dbManager.deleteOldPerson(person);
  89. }
  90.  
  91. public void query(View view)
  92. {
  93. List<Person> persons = dbManager.query();
  94. ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
  95. for (Person person : persons)
  96. {
  97. HashMap<String, String> map = new HashMap<String, String>();
  98. map.put("name", person.name);
  99. map.put("info", person.age + " years old, " + person.info);
  100. list.add(map);
  101. }
  102. SimpleAdapter adapter = new SimpleAdapter(this, list,
  103. android.R.layout.simple_list_item_2, new String[] { "name",
  104. "info" }, new int[] { android.R.id.text1,
  105. android.R.id.text2 });
  106. listView.setAdapter(adapter);
  107. }
  108.  
  109. @SuppressWarnings("deprecation")
  110. public void queryTheCursor(View view)
  111. {
  112. Cursor c = dbManager.queryTheCursor();
  113. startManagingCursor(c); // 托付给activity根据自己的生命周期去管理Cursor的生命周期
  114. CursorWrapper cursorWrapper = new CursorWrapper(c)
  115. {
  116. @Override
  117. public String getString(int columnIndex)
  118. {
  119. // 将简介前加上年龄
  120. if (getColumnName(columnIndex).equals("info"))
  121. {
  122. int age = getInt(getColumnIndex("age"));
  123. return age + " years old, " + super.getString(columnIndex);
  124. }
  125. return super.getString(columnIndex);
  126. }
  127. };
  128. // 确保查询结果中有"_id"列
  129. SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
  130. android.R.layout.simple_list_item_2, cursorWrapper,
  131. new String[] { "name", "info" }, new int[] {
  132. android.R.id.text1, android.R.id.text2 });
  133. ListView listView = (ListView) findViewById(R.id.listView);
  134. listView.setAdapter(adapter);
  135. }
  136.  
  137. }

布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6.  
  7. <Button
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:onClick="add"
  11. android:text="add" />
  12.  
  13. <Button
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. android:onClick="update"
  17. android:text="update" />
  18.  
  19. <Button
  20. android:layout_width="fill_parent"
  21. android:layout_height="wrap_content"
  22. android:onClick="delete"
  23. android:text="delete" />
  24.  
  25. <Button
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content"
  28. android:onClick="query"
  29. android:text="query" />
  30.  
  31. <Button
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content"
  34. android:onClick="queryTheCursor"
  35. android:text="queryTheCursor" />
  36.  
  37. <ListView
  38. android:id="@+id/listView"
  39. android:layout_width="fill_parent"
  40. android:layout_height="wrap_content" />
  41.  
  42. </LinearLayout>

常量:

  1. package com.example.hellodatabases;
  2.  
  3. public class AppConstants
  4. {
  5. public static final String LOG_TAG="Hello DB";
  6.  
  7. }

官网Training: Saving Data in SQL Databases

  http://developer.android.com/training/basics/data-storage/databases.html

  Android中SQLite应用详解:

  http://blog.csdn.net/liuhe688/article/details/6715983

  关于Cursor类的介绍:

  http://www.cnblogs.com/TerryBlog/archive/2010/07/05/1771459.html

  Android 小项目之--SQLite 使用法门 (附源码):

  http://www.cnblogs.com/TerryBlog/archive/2010/06/12/1757166.html

Android SQLite案例的更多相关文章

  1. Android SQLite 通配符查询找不到参数问题

    使用Android SQLite中SQLiteDatabase类的query方法查询时,如果where中包含通配符,则参数会无法设置,如类似下面的方法查询时 SQLiteDatabase db = d ...

  2. Android+Sqlite 实现古诗阅读应用(三)

    往期传送门: Android+Sqlite 实现古诗阅读应用(一) Android+Sqlite 实现古诗阅读应用(二) 加入截图分享的功能. 很多应用都有分享的功能,我也想在我的古诗App里加入这个 ...

  3. Android+Sqlite 实现古诗阅读应用(二)

    传送门:Android+Sqlite 实现古诗阅读应用(一) Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择 ...

  4. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  5. Android SQLite总结(一) (转)

    Android SQLite总结(一)  郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...

  6. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  7. Android sqlite管理数据库基本用法

    Android操作系统中内置了sqlite数据库(有关sqlite数据库详细介绍见:http://zh.wikipedia.org/wiki/SQLite),而sqllite本身是一个很小型的数据库, ...

  8. Android SQLite 数据库详细介绍

    Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...

  9. Android Sqlite 导入CSV文件 .

    http://blog.csdn.net/johnnycode/article/details/7413111 今天遇到 Oracle 导出的12万条CSV格式数据导入 Android Sqlite ...

随机推荐

  1. HDU 5442 后缀自动机(从环字符串选定一个位置 , 时针或顺时针走一遍,希望得到字典序最大)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 题目大意: 给定一个字符串,可理解成环,然后选定一位置,逆时针或顺时针走一遍,希望得到字典序最大,如果同样 ...

  2. [转] Centos 系统swap虚拟内存添加与删除配置

    [From]https://blog.csdn.net/lengyue1084/article/details/51405640 [From]https://yuukis.cn/24/ SWAP是Li ...

  3. Vue项目中使用HighChart

    记:初次在Vue项目中使用 HighChart 的时候要走的坑 感谢这位哥们的思路 传送门 Vue-cli项目使用 npm install highcharts --save 让我们看看 highch ...

  4. python创建目录并更改权限的代码

    如下代码段是关于python创建目录并更改权限的代码. import os os.mkdir("foo", 0666)

  5. WordCount C语言实现求文本的字符数,单词数,行数

    1.码云地址: https://gitee.com/miaomiaobobo/WordCount 2.psp表格 PSP2.1表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) P ...

  6. 递归迭代vector三种方法实现二路归并排序

    https://mp.csdn.net/mdeditor/84933084# 附链接

  7. checkbox 框 选中判断

    function checkAll(checktop){ $(":checkbox[name='id']").prop("checked",checktop.c ...

  8. 在用 Node.js 起服务之前,我们应该知道这些

    网络分层 了解计算机网络的同学都知道 OSI 七层网络模型和 TCP/IP 模型.OSI 七层模型是理论上的网络通信模型,而 TCP/IP 是现实中的网络通信概念模型.它们之间的对比关系参考下图. 本 ...

  9. PHP如何判断对象为空的方法分享

    1.网上很多方法分享说用empty()方法判断对象是否为空.empty()的方法介绍:格式:bool empty ( mixed var )功能:检查一个变量是否为空返回值:若变量不存在则返回 TRU ...

  10. WPF与Winform中的不同(1)

    1. 部分控件的Text属性,变成了 Content属性 如: winform中,Button.Text = "abc"; wpf中,Button.Content = " ...