• android开发中的数据库SQLite的使用


    其实学习android很久了,关于数据存储,之前学习的时候也一同学习过,编程这些东西很久没用都忘得差不多了,最近做个项目要用到,所以又学习了一遍。

    android中关于数据的存储有好几种,这次主要是SQLite的使用。

    首先说一点,我的技术很烂,原理什么的不说了,就是讲一下怎么使用,包括“增删改查”这几个操作。

    使用数据库的前提是有数据库,有表,所以我们首先是要有一个数据库,然后还得建一张表(至少一张表)。sql语句就是“create table XXX()”。作为一个数据库系统,SQLite也是遵守SQL92标准的,和其他的数据库都差不多,所以有过数据库开发经验的对这些sql语句都不陌生。

      开发中使用数据库

      创建数据库

          android中提供了SQLiteOpenHelper这个类来帮助你管理数据库。包括创建和更新数据库。所以你只要继承SQLiteOpenHelper类来对数据库进行管理就行。

    public class DBHelper extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "test.db";
        private static final int DATABASE_VERSION = 1;
        public DBHelper(Context context){
            super(context,DATABASE_NAME,null,DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db){
            db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                    " name VARCHAR,age INTEGER, info TEXT)");//建表,对数据库进行操作等
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
            db.execSQL("ALTER TABLE person COLUMN other STRING");
        }
    }
    SQLiteOpenHelper类的构造函数有四个参数
    public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
            this(context, name, factory, version, null);
        }

    这是我在sdk源代码SQLiteOpenHelper类中复制的。context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。

      在构造函数中就会创建数据库。

      使用数据库

      数据库已经创建好,通常我们通过getReadAbleDatabase()或getWriteableDatabase()方法来获取一个数据库实例。可以在onCreate()方法中对数据库进行操作。不过为了便于管理,还是建议大家重新写一个专门的工具类。

      创建表

    其实在onCreate()方法中就是在创建表。

    db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                    " name VARCHAR,age INTEGER, info TEXT)");
    表名是person,_id是主键,为自增长,name是verchar型,age是integer型,info是text型。

       表操作

      表的操作就是增删改查,android中提供了两种方法(就我知道的)。分别是sql语句和封装好的insert(),delete(),update(),query()。后边的这些方法也是对sql语句的封装。

        

      db.execSQL("insert into ....");  

      还有就是

      ContentValues cv = new ContentValues();

      cv.put();

      cv.put();

      db.insert("tableName",getNullColunmHack(),cv);

      函数原型是insert(String table, String nullColumnHack, ContentValues values),其实insert()的底层也是execSQL()。

      删

      和添加的操作差不多。db.execSQL()和db.delete()

      改

      和上边两个操作的也是相同的。

      查

      因为查询的结果是返回一个游标(Cursor)。rawQuery(String sql, String[] selectionArgs)。通过移动游标来进行数据的查询。

     1         Cursor c = db.rawQuery("SELECT * FROM person", null);
     2         while(c.moveToNext()){
     3             Person p = new Person();
     4             p.set_id(c.getInt(c.getColumnIndex("_id")));
     5             p.setName(c.getString(c.getColumnIndex("name")));
     6             p.setAge(c.getInt(c.getColumnIndex("age")));
     7             p.setInfo(c.getString(c.getColumnIndex("info")));
     8             persons.add(p);
     9         }
    10         c.close();                

    所有的操作也差不多就是这些。

    最后添加几张截图。

    最后是全部源代码

    activity.java

      1 package com.sqlitedemo.activity;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.view.View;
      6 import android.widget.Button;
      7 import android.widget.ListView;
      8 import android.widget.SimpleAdapter;
      9 import android.widget.Toast;
     10 
     11 import com.tiancz.sqlitedemo.R;
     12 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.DBManager;
     13 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.Person;
     14 
     15 import java.util.ArrayList;
     16 import java.util.HashMap;
     17 import java.util.List;
     18 import java.util.Map;
     19 
     20 /**
     21  * Created by tiancz on 2015/3/7.
     22  */
     23 public class activity00 extends Activity {
     24 
     25     private DBManager dm;
     26     private ListView lv;
     27 
     28     private Button add;
     29     private Button query;
     30     private Button update;
     31     private Button delete;
     32     private Button drop;
     33     @Override
     34     protected void onCreate(Bundle savedInstanceState) {
     35         super.onCreate(savedInstanceState);
     36         setContentView(R.layout.activity00);
     37 
     38         lv = (ListView)findViewById(R.id.lv_00);
     39         query = (Button)findViewById(R.id.query00);
     40         add = (Button)findViewById(R.id.add00);
     41         update = (Button)findViewById(R.id.update00);
     42         delete = (Button)findViewById(R.id.deleteAll00);
     43         drop = (Button)findViewById(R.id.drop00);
     44 
     45         dm = new DBManager(this);
     46 
     47         add.setOnClickListener(new View.OnClickListener() {
     48             @Override
     49             public void onClick(View v) {
     50                 add(v);
     51             }
     52         });
     53 
     54         query.setOnClickListener(new View.OnClickListener() {
     55             @Override
     56             public void onClick(View v) {
     57                 query(v);
     58             }
     59         });
     60 
     61         update.setOnClickListener(new View.OnClickListener() {
     62             @Override
     63             public void onClick(View v) {
     64                 update(v);
     65             }
     66         });
     67 
     68         delete.setOnClickListener(new View.OnClickListener() {
     69             @Override
     70             public void onClick(View v) {
     71                 deleteALL(v);
     72             }
     73         });
     74 
     75 //        drop.setOnClickListener(new View.OnClickListener() {
     76 //            @Override
     77 //            public void onClick(View v) {
     78 //                dropTable(v);
     79 //            }
     80 //        });
     81     }
     82 
     83 
     84     @Override
     85     protected void onDestroy(){
     86         super.onDestroy();
     87         dm.closeDB();
     88     }
     89 
     90     public void add(View view){
     91         List<Person> persons = new ArrayList<>();
     92         Person p1 = new Person("tom",21,"lively boy");
     93         Person p2 = new Person("bill",23,"handsome");
     94         Person p3 = new Person("gate",22,"sexy boy");
     95         Person p4 = new Person("joe",24,"hot boy");
     96         Person p5 = new Person("jhon",29,"pretty");
     97 
     98         persons.add(p1);
     99         persons.add(p2);
    100         persons.add(p3);
    101         persons.add(p4);
    102         persons.add(p5);
    103 
    104         dm.add(persons);
    105     }
    106     public void update(View view){
    107         Person p = new Person();
    108         p.setName("jhon");
    109         p.setAge(40);
    110         dm.updateAge(p);
    111     }
    112 
    113     public void deleteALL(View view){
    114         dm.delete();
    115     }
    116 
    117     public void delete(View view){
    118         Person p = new Person();
    119         p.setAge(30);
    120         dm.deleteOldPerson(p);
    121     }
    122 
    123 //    public void dropTable(View view){
    124 //        dm.dropTable();
    125 //    }
    126 
    127     public void query(View view){
    128         List<Person>persons    = dm.findAllPerson();
    129         ArrayList<Map<String,String>> list = new ArrayList<>();
    130         for (Person p:persons){
    131             HashMap<String,String>map = new HashMap<>();
    132             map.put("name",p.getName());
    133             map.put("info","No."+p.get_id()+" "+p.getAge()+" years old,"+p.getInfo());
    134             list.add(map);
    135         }
    136         SimpleAdapter adapter = new SimpleAdapter(this,list,android.R.layout.simple_list_item_2,
    137                 new String[]{"name","info"},new int[]{android.R.id.text1,android.R.id.text2});
    138         lv.setAdapter(adapter);
    139         if(list.isEmpty()){
    140             Toast.makeText(this,"列表里还没人呢",Toast.LENGTH_SHORT).show();
    141         }
    142     }
    143 }

    activity.xml

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

    DBHelper.java

     1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteOpenHelper;
     6 
     7 /**
     8  * Created by tiancz on 2015/3/8.
     9  */
    10 public class DBHelper extends SQLiteOpenHelper {
    11     private static final String DATABASE_NAME = "test.db";
    12     private static final int DATABASE_VERSION = 1;
    13     public DBHelper(Context context){
    14         super(context,DATABASE_NAME,null,DATABASE_VERSION);
    15     }
    16 
    17     @Override
    18     public void onCreate(SQLiteDatabase db){
    19         db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
    20                 " name VARCHAR,age INTEGER, info TEXT)");
    21 
    22     }
    23 
    24     @Override
    25     public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
    26         db.execSQL("ALTER TABLE person COLUMN other STRING");
    27     }
    28 }

    DBManager.java

     1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
     2 
     3 import android.content.ContentValues;
     4 import android.content.Context;
     5 import android.database.Cursor;
     6 import android.database.sqlite.SQLiteDatabase;
     7 
     8 import java.util.ArrayList;
     9 import java.util.List;
    10 
    11 /**
    12  * Created by tiancz on 2015/3/8.
    13  */
    14 public class DBManager {
    15     private DBHelper helper;
    16     private SQLiteDatabase db;
    17 
    18     public DBManager(Context context){
    19         helper = new DBHelper(context);
    20         db = helper.getWritableDatabase();
    21     }
    22 
    23     public void add(List<Person> persons){
    24         db.beginTransaction();
    25         try{
    26             for (Person p:persons){
    27                 db.execSQL("INSERT INTO person VALUES(null,?,?,?)",
    28                         new Object[]{p.getName(),p.getAge(),p.getInfo()});
    29             }
    30             db.setTransactionSuccessful();
    31         }catch(Exception e){
    32             e.printStackTrace();
    33         }finally {
    34             db.endTransaction();
    35         }
    36     }
    37 
    38     public void updateAge(Person p){
    39         ContentValues cv = new ContentValues();
    40         cv.put("age",p.getAge());
    41         db.update("person",cv,"name=?",new String[]{p.getName()});
    42     }
    43 
    44     public void delete(){
    45         db.execSQL("delete from person where name='tom'");
    46         db.execSQL("delete from person where name='bill'");
    47         db.execSQL("delete from person where name='gate'");
    48         db.execSQL("delete from person where name='joe'");
    49         db.execSQL("delete from person where name='jhon'");
    50     }
    51 
    52     public void deleteOldPerson(Person p){
    53         db.delete("person","age=?",new String[]{String.valueOf(p.getAge())});
    54     }
    55 
    56     public List<Person> findAllPerson(){
    57         ArrayList<Person> persons = new ArrayList<Person>();
    58         Cursor c = db.rawQuery("SELECT * FROM person", null);
    59         while(c.moveToNext()){
    60             Person p = new Person();
    61             p.set_id(c.getInt(c.getColumnIndex("_id")));
    62             p.setName(c.getString(c.getColumnIndex("name")));
    63             p.setAge(c.getInt(c.getColumnIndex("age")));
    64             p.setInfo(c.getString(c.getColumnIndex("info")));
    65             persons.add(p);
    66         }
    67         c.close();
    68         return persons;
    69     }
    70 
    71 //    public void dropTable(){
    72 //        db.execSQL("drop table person");
    73 //    }
    74 
    75     public void closeDB(){
    76         db.close();
    77     }
    78 
    79 
    80 }
    DBManager.java

    Person.java

     1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
     2 
     3 /**
     4  * Created by tiancz on 2015/3/8.
     5  */
     6 public class Person {
     7     private int _id;
     8     private String name;
     9     private int age;
    10     private String info;
    11 
    12     public Person(){}
    13 
    14     public Person(String name,int age,String info){
    15         this.name=name;
    16         this.age=age;
    17         this.info=info;
    18     }
    19 
    20     public int get_id() {
    21         return _id;
    22     }
    23 
    24     public void set_id(int _id) {
    25         this._id = _id;
    26     }
    27 
    28     public int getAge() {
    29         return age;
    30     }
    31 
    32     public void setAge(int age) {
    33         this.age = age;
    34     }
    35 
    36     public String getName() {
    37         return name;
    38     }
    39 
    40     public void setName(String name) {
    41         this.name = name;
    42     }
    43 
    44     public String getInfo() {
    45         return info;
    46     }
    47 
    48     public void setInfo(String info) {
    49         this.info = info;
    50     }
    51 }
    Person.java

    这就是全部的代码。

      总结

      刚开始做的时候忘了实例化DBManager,所以导致无法对数据库进行操作,一直显示的空指针异常,看了好久才发现忘了这一句

      dm = new DBManager(this);

      对于信息越来越多,数据库的使用越发显得重要。学习android,数据库的学习必不可少。

  • 相关阅读:
    java环境变量配置(转)
    【Android】SlidingMenu属性详解(转)
    android.intent.action.MAIN 与 android.intent.category.LAUNCHER 的验证理解 (转)
    实现Activity刷新(转)
    测试服务API的_苏飞开发助手_使用说明
    在getView方法产生给用户item的视图以及数据
    pl/sql developer 登陆提示ORA-12514(转)
    tnsnames.ora存放路径
    一个较为复杂的布局例子
    Android ImageView图片自适应 (转)
  • 原文地址:https://www.cnblogs.com/nathanieltian/p/4329736.html
Copyright © 2020-2023  润新知