其实学习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,数据库的学习必不可少。