Android中SQLite应用详解

参考文章:http://blog.csdn.net/liuhe688/article/details/6715983

本文只是记录一下sqlite应用的过程。

?

?

程序结构如下:

其中,DBManger继承DBHelper, Person是一个实体类,MyActivity是一个主界面,main.xml里面定义了一个listview。

  1. 编写DBHelper

    1. package com.example.myapp;
    2. ?
    3. import android.content.Context;
    4. import android.database.sqlite.SQLiteDatabase;
    5. import android.database.sqlite.SQLiteOpenHelper;
    6. ?
    7. /**
    8. ?* Created by zhuxuekui on 2015/5/18.
    9. ?*/
    10. public
      class DBHelper extends SQLiteOpenHelper {
    11. ????private
      static
      final String name = "test.db";
    12. ????private
      static
      final
      int version = 1;
    13. [email protected]
    14. ????public
      void onCreate(SQLiteDatabase sqLiteDatabase) {
    15. ????????sqLiteDatabase.execSQL("create table if not exists person"
    16. ????????+ "(_id integer primary key autoincrement , name varchar , age integer, info text )");
    17. ????}
    18. ?
    19. [email protected]
    20. ????public
      void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    21. ????????sqLiteDatabase.execSQL("alter table person add column other siring");
    22. ????}
    23. ?
    24. ????public DBHelper(Context context) {
    25. ????????super(context, name, null, version);
    26. ????}
    27. }

此类在数据库第一次创建时,通过构造方法执行。 然后执行onCreate,创建person表,除非我们卸载应用,不然就不会再次执行oncreate,当系统发现版本变化之后,我们会调用onUpgrade去更新,这里我们执行某些修改表的操作。

其中,我们通过version去判断是不是需要更新。

  1. 接下来,我们编写Person数据表对应的实体类

    1. package com.example.myapp;
    2. ?
    3. /**
    4. ?* Created by zhuxuekui on 2015/5/18.
    5. ?*/
    6. public
      class Person {
    7. ????public
      int _id;
    8. ????public String name;
    9. ????public
      int age;
    10. ????public String info;
    11. ?
    12. ????public Person(String name, int age, String info) {
    13. ????????this.name = name;
    14. ????????this.age = age;
    15. ????????this.info = info;
    16. ????}
    17. ????public Person()
    18. ????{
    19. ?
    20. ????}
    21. ?
    22. }

    实体类,没啥好讲,加入我们声明成private,这就需要set,get一下了。封装好然后下面在调用。

  2. 下面就是重头戏了,主要涉及数据库的增删改查

    1. ?
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. ?
    5. import android.content.ContentValues;
    6. import android.content.Context;
    7. import android.database.Cursor;
    8. import android.database.sqlite.SQLiteDatabase;
    9. ?
    10. public
      class DBManager {
    11. ???private DBHelper helper;
    12. ???private SQLiteDatabase db;
    13. ?
    14. ???public DBManager(Context context) {
    15. ??????helper = new DBHelper(context);
    16. ??????//因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
    17. ??????//所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
    18. ??????db = helper.getWritableDatabase();
    19. ???}
    20. ?
    21. ???/**
    22. ????* add persons
    23. ????* @param persons
    24. ????*/
    25. ???public
      void add(List<Person> persons) {
    26. ????????db.beginTransaction(); //开始事务
    27. ????????try {
    28. ???????????for (Person person : persons) {
    29. ??????????????db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new Object[]{person.name, person.age, person.info});
    30. ???????????}
    31. ???????????db.setTransactionSuccessful(); //设置事务成功完成
    32. ????????} finally {
    33. ???????????db.endTransaction(); //结束事务
    34. ????????}
    35. ???}
    36. ?
    37. ???/**
    38. ????* update person‘s age
    39. ????* @param person
    40. ????*/
    41. ???public
      void updateAge(Person person) {
    42. ??????ContentValues cv = new ContentValues();
    43. ??????cv.put("age", person.age);
    44. ??????db.update("person", cv, "name = ?", new String[]{person.name});
    45. ???}
    46. ?
    47. ???/**
    48. ????* delete old person
    49. ????* @param person
    50. ????*/
    51. ???public
      void deleteOldPerson(Person person) {
    52. ??????db.delete("person", "age >= ?", new String[]{String.valueOf(person.age)});
    53. ???}
    54. ?
    55. ???/**
    56. ????* query all persons, return list
    57. ????* @return List<Person>
    58. ????*/
    59. ???public List<Person> query() {
    60. ??????ArrayList<Person> persons = new ArrayList<Person>();
    61. ??????Cursor c = queryTheCursor();
    62. ????????while (c.moveToNext()) {
    63. ???????????Person person = new Person();
    64. ???????????person._id = c.getInt(c.getColumnIndex("_id"));
    65. ???????????person.name = c.getString(c.getColumnIndex("name"));
    66. ???????????person.age = c.getInt(c.getColumnIndex("age"));
    67. ???????????person.info = c.getString(c.getColumnIndex("info"));
    68. ???????????persons.add(person);
    69. ????????}
    70. ????????c.close();
    71. ????????return persons;
    72. ???}
    73. ?
    74. ???/**
    75. ????* query all persons, return cursor
    76. ????* @return Cursor
    77. ????*/
    78. ???public Cursor queryTheCursor() {
    79. ????????Cursor c = db.rawQuery("SELECT * FROM person", null);
    80. ????????return c;
    81. ???}
    82. ?
    83. ???/**
    84. ????* close database
    85. ????*/
    86. ???public
      void closeDB() {
    87. ??????db.close();
    88. ???}
    89. }

    在DBManager中实例化dbHelper,然后通过dbHelper得到一个SQLiteDatabase对象,作为整个应用的数据库实例;在add方法中,我们应用了事务去处理,先beginTransaction,然后设置事务成功,结束事务。这里就不需要提交了commit了。这是另一种事务的写法。当然,在执行增删改的过程中,我们可以通过exec (sql语句)来完成,也可以通过db.update() db.insert() 等方法完成。或者需要声明ContentValues 对象。

  3. 编写xml文件,用于主界面的布局

    界面部分没啥可讲,基本功。

  4. 编写主要业务逻辑部分

    1. package com.scott.db;
    2. ?
    3. import java.util.ArrayList;
    4. import java.util.HashMap;
    5. import java.util.List;
    6. import java.util.Map;
    7. ?
    8. import android.app.Activity;
    9. import android.database.Cursor;
    10. import android.database.CursorWrapper;
    11. import android.os.Bundle;
    12. import android.view.View;
    13. import android.widget.ListView;
    14. import android.widget.SimpleAdapter;
    15. import android.widget.SimpleCursorAdapter;
    16. ?
    17. ?
    18. public
      class MainActivity extends Activity {
    19. ?
    20. ???private DBManager mgr;
    21. ???private ListView listView;
    22. ?
    23. [email protected]
    24. ????public
      void onCreate(Bundle savedInstanceState) {
    25. ????????super.onCreate(savedInstanceState);
    26. ????????setContentView(R.layout.main);
    27. ????????listView = (ListView) findViewById(R.id.listView);
    28. ????????//初始化DBManager
    29. ????????mgr = new DBManager(this);
    30. ????}
    31. ?
    32. [email protected]
    33. ????protected
      void onDestroy() {
    34. ???????super.onDestroy();
    35. ???????//应用的最后一个Activity关闭时应释放DB
    36. ???????mgr.closeDB();
    37. ????}
    38. ?
    39. ????public
      void add(View view) {
    40. ???????ArrayList<Person> persons = new ArrayList<Person>();
    41. ?
    42. ???????Person person1 = new Person("Ella", 22, "lively girl");
    43. ???????Person person2 = new Person("Jenny", 22, "beautiful girl");
    44. ???????Person person3 = new Person("Jessica", 23, "sexy girl");
    45. ???????Person person4 = new Person("Kelly", 23, "hot baby");
    46. ???????Person person5 = new Person("Jane", 25, "a pretty woman");
    47. ?
    48. ???????persons.add(person1);
    49. ???????persons.add(person2);
    50. ???????persons.add(person3);
    51. ???????persons.add(person4);
    52. ???????persons.add(person5);
    53. ?
    54. ???????mgr.add(persons);
    55. ????}
    56. ?
    57. ????public
      void update(View view) {
    58. ???????Person person = new Person();
    59. ???????person.name = "Jane";
    60. ???????person.age = 30;
    61. ???????mgr.updateAge(person);
    62. ????}
    63. ?
    64. ????public
      void delete(View view) {
    65. ???????Person person = new Person();
    66. ???????person.age = 30;
    67. ???????mgr.deleteOldPerson(person);
    68. ????}
    69. ?
    70. ????public
      void query(View view) {
    71. ???????List<Person> persons = mgr.query();
    72. ???????ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    73. ???????for (Person person : persons) {
    74. ??????????HashMap<String, String> map = new HashMap<String, String>();
    75. ??????????map.put("name", person.name);
    76. ??????????map.put("info", person.age + " years old, " + person.info);
    77. ??????????list.add(map);
    78. ???????}
    79. ???????SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2,
    80. ????????????????new String[]{"name", "info"}, new
      int[]{android.R.id.text1, android.R.id.text2});
    81. ???????listView.setAdapter(adapter);
    82. ????}
    83. ?
    84. ????public
      void queryTheCursor(View view) {
    85. ???????Cursor c = mgr.queryTheCursor();
    86. ???????startManagingCursor(c); //托付给activity根据自己的生命周期去管理Cursor的生命周期
    87. ???????CursorWrapper cursorWrapper = new CursorWrapper(c) {
    88. [email protected]
    89. ??????????public String getString(int columnIndex) {
    90. ?????????????//将简介前加上年龄
    91. ?????????????if (getColumnName(columnIndex).equals("info")) {
    92. ????????????????int age = getInt(getColumnIndex("age"));
    93. ????????????????return age + " years old, " + super.getString(columnIndex);
    94. ?????????????}
    95. ?????????????return
      super.getString(columnIndex);
    96. ??????????}
    97. ???????};
    98. ???????//确保查询结果中有"_id"列
    99. ??????SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
    100. ????????????cursorWrapper, new String[]{"name", "info"}, new
      int[]{android.R.id.text1, android.R.id.text2});
    101. ??????ListView listView = (ListView) findViewById(R.id.listView);
    102. ??????listView.setAdapter(adapter);
    103. ????}
    104. }

    这里面的代码和DBManger里面的代码结构上很相似,这里面在query处,我们用到了simpleAdapter.。这种主要接受list对象,Hashmap也可以。然后,做一些适配。结果如下:

时间: 2024-10-06 01:20:10

Android中SQLite应用详解的相关文章

Android中SQLite应用详解(转)

上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们对SQLite已经有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite. 现在的主流移动设备像Android.iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到 SQLite来存储我们大量的数据,所以我们就需要掌握移动设备上的SQLite开发技巧.对于Android平台来说,系统内置了丰富的API来供开发 人员操作SQLite,我们可以轻松的完成对数据的存取

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

Android中Intent组件详解

Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作.与动作有关的数据等.Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android的媒婆任务就完成了. 在Google Doc中是这样描述Intent的(摘自Android中文翻译组)当接收到ContentR

Android中HttpURLConnection使用详解

认识Http协议 Android中发送http网络请求是很常见的,要有GET请求和POST请求.一个完整的http请求需要经历两个过程:客户端发送请求到服务器,然后服务器将结果返回给客户端,如下图所示: 客户端->服务器 客户端向服务器发送请求主要包含以下信息:请求的Url地址.请求头以及可选的请求体,打开百度首页,客户端向服务器发送的信息如下所示: 请求URL(Request URL) 上图中的Request URL就是请求的Url地址,即https://www.baidu.com,该Url没

Android中launchMode模式详解

关于Android中launchMode的文章介绍的真心不少,广为流传而且介绍的最详细的莫过于这篇文章http://blog.csdn.net/android_tutor/article/details/6310015.但是这篇文章中关于singletask和singleinstance在评论中还是有些不解和争论,在此根据实例重点说下这两种模式: 实例简介:有两个Activity,分别为AActivity和BActivity,界面相同.点击按钮A和B,分别启动AActivity和BActivit

Android中shape属性详解

一.简单使用 刚开始,就先不讲一堆标签的意义及用法,先简单看看shape标签怎么用. 1.新建shape文件 首先在res/drawable文件夹下,新建一个文件,命名为:shape_radius.xml 内容是这样的:(先不需要理解,先看shape怎么用) [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="ht

Android中BitmapFactory.Options详解

在Android中,BitmapFactory相信大家都很熟悉了,这个类里面的所有方法都是用来解码创建一个Bitmap,其中有一个重要的类是Options,此类用于解码Bitmap时的各种参数控制,那这里面的各种参数都是什么含义呢?今天我们就来重点解读几个参数. inJustDecodeBounds: 如果将这个值置为true,那么在解码的时候将不会返回bitmap,只会返回这个bitmap的尺寸.这个属性的目的是,如果你只想知道一个bitmap的尺寸,但又不想将其加载到内存时.这是一个非常有用

Android中的Intent详解

前言: 每个应用程序都有若干个Activity组成,每一个Activity都是一个应用程序与用户进行交互的窗口,呈现不同的交互界面.因为每一个Acticity的任务不一样,所以经常互在各个Activity之间进行跳转,在Android中这个动作是靠Intent来完成的.你通过startActivity()方法发送一个Intent给系统,系统会根据这个Intent帮助你找到对应的Activity,即使这个Activity在其他的应用中,也可以用这种方法启动它. Intent的定义: Intent是

Android中各个权限详解

在Android的设计中,资源的访问或者网络连接,要得到这些服务都需要声明其访问权限,否则将无法正常工作.在Android中这样的权限有很多种,这里将各类访问权限一一罗列出来,供大家使用时参考之用. android.permission.EXPAND_STATUS_BAR允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序 android.permission.FACTORY_TEST作为一个工厂测试程序,运行在root用户 android