wordpress国人cms/网页搜索优化
其实学习android很久了,关于数据存储,之前学习的时候也一同学习过,编程这些东西很久没用都忘得差不多了,最近做个项目要用到,所以又学习了一遍。
android中关于数据的存储有好几种,这次主要是SQLite的使用。
首先说一点,我的技术很烂,原理什么的不说了,就是讲一下怎么使用,包括“增删改查”这几个操作。
使用数据库的前提是有数据库,有表,所以我们首先是要有一个数据库,然后还得建一张表(至少一张表)。sql语句就是“create table XXX()”。作为一个数据库系统,SQLite也是遵守SQL92标准的,和其他的数据库都差不多,所以有过数据库开发经验的对这些sql语句都不陌生。
开发中使用数据库
创建数据库
android中提供了SQLiteOpenHelper这个类来帮助你管理数据库。包括创建和更新数据库。所以你只要继承SQLiteOpenHelper类来对数据库进行管理就行。
public class DBHelper extendsSQLiteOpenHelper {private static final String DATABASE_NAME = "test.db";private static final int DATABASE_VERSION = 1;publicDBHelper(Context context){super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
@Overridepublic voidonCreate(SQLiteDatabase db){
db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
" name VARCHAR,age INTEGER, info TEXT)");//建表,对数据库进行操作等
}
@Overridepublic void onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion){
db.execSQL("ALTER TABLE person COLUMN other STRING");
}
}
SQLiteOpenHelper类的构造函数有四个参数
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, intversion) {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 = newPerson();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 packagecom.sqlitedemo.activity;2
3 importandroid.app.Activity;4 importandroid.os.Bundle;5 importandroid.view.View;6 importandroid.widget.Button;7 importandroid.widget.ListView;8 importandroid.widget.SimpleAdapter;9 importandroid.widget.Toast;10
11 importcom.tiancz.sqlitedemo.R;12 importcom.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.DBManager;13 importcom.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.Person;14
15 importjava.util.ArrayList;16 importjava.util.HashMap;17 importjava.util.List;18 importjava.util.Map;19
20 /**
21 * Created by tiancz on 2015/3/7.22 */
23 public class activity00 extendsActivity {24
25 privateDBManager dm;26 privateListView lv;27
28 privateButton add;29 privateButton query;30 privateButton update;31 privateButton delete;32 privateButton drop;33 @Override34 protected voidonCreate(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(newView.OnClickListener() {48 @Override49 public voidonClick(View v) {50 add(v);51 }52 });53
54 query.setOnClickListener(newView.OnClickListener() {55 @Override56 public voidonClick(View v) {57 query(v);58 }59 });60
61 update.setOnClickListener(newView.OnClickListener() {62 @Override63 public voidonClick(View v) {64 update(v);65 }66 });67
68 delete.setOnClickListener(newView.OnClickListener() {69 @Override70 public voidonClick(View v) {71 deleteALL(v);72 }73 });74
75 //drop.setOnClickListener(new View.OnClickListener() {76 //@Override77 //public void onClick(View v) {78 //dropTable(v);79 //}80 //});
81 }82
83
84 @Override85 protected voidonDestroy(){86 super.onDestroy();87 dm.closeDB();88 }89
90 public voidadd(View view){91 List 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 voidupdate(View view){107 Person p = newPerson();108 p.setName("jhon");109 p.setAge(40);110 dm.updateAge(p);111 }112
113 public voiddeleteALL(View view){114 dm.delete();115 }116
117 public voiddelete(View view){118 Person p = newPerson();119 p.setAge(30);120 dm.deleteOldPerson(p);121 }122
123 //public void dropTable(View view){124 //dm.dropTable();125 //}
126
127 public voidquery(View view){128 Listpersons =dm.findAllPerson();129 ArrayList> list = new ArrayList<>();130 for(Person p:persons){131 HashMapmap = 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
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical">
6
7
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:text="Add"/>
12
14 android:layout_width="wrap_content"
15 android:layout_height="wrap_content"
16 android:text="update"/>
17
19 android:layout_width="wrap_content"
20 android:layout_height="wrap_content"
21 android:text="deleteAll"/>
22
24 android:layout_width="wrap_content"
25 android:layout_height="wrap_content"
26 android:text="delete"/>
27
29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content"
31 android:text="drop"/>
32
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:text="query"/>
37
38
40 android:layout_width="fill_parent"
41 android:layout_height="wrap_content">
42
43
DBHelper.java
1 packagecom.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2
3 importandroid.content.Context;4 importandroid.database.sqlite.SQLiteDatabase;5 importandroid.database.sqlite.SQLiteOpenHelper;6
7 /**
8 * Created by tiancz on 2015/3/8.9 */
10 public class DBHelper extendsSQLiteOpenHelper {11 private static final String DATABASE_NAME = "test.db";12 private static final int DATABASE_VERSION = 1;13 publicDBHelper(Context context){14 super(context,DATABASE_NAME,null,DATABASE_VERSION);15 }16
17 @Override18 public voidonCreate(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 @Override25 public void onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion){26 db.execSQL("ALTER TABLE person COLUMN other STRING");27 }28 }
DBManager.java
1 packagecom.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2
3 importandroid.content.ContentValues;4 importandroid.content.Context;5 importandroid.database.Cursor;6 importandroid.database.sqlite.SQLiteDatabase;7
8 importjava.util.ArrayList;9 importjava.util.List;10
11 /**
12 * Created by tiancz on 2015/3/8.13 */
14 public classDBManager {15 privateDBHelper helper;16 privateSQLiteDatabase db;17
18 publicDBManager(Context context){19 helper = newDBHelper(context);20 db =helper.getWritableDatabase();21 }22
23 public void add(Listpersons){24 db.beginTransaction();25 try{26 for(Person p:persons){27 db.execSQL("INSERT INTO person VALUES(null,?,?,?)",28 newObject[]{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 voidupdateAge(Person p){39 ContentValues cv = newContentValues();40 cv.put("age",p.getAge());41 db.update("person",cv,"name=?",newString[]{p.getName()});42 }43
44 public voiddelete(){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 voiddeleteOldPerson(Person p){53 db.delete("person","age=?",newString[]{String.valueOf(p.getAge())});54 }55
56 public ListfindAllPerson(){57 ArrayList persons = new ArrayList();58 Cursor c = db.rawQuery("SELECT * FROM person", null);59 while(c.moveToNext()){60 Person p = newPerson();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 returnpersons;69 }70
71 //public void dropTable(){72 //db.execSQL("drop table person");73 //}
74
75 public voidcloseDB(){76 db.close();77 }78
79
80 }
DBManager.java
Person.java
1 packagecom.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;2
3 /**
4 * Created by tiancz on 2015/3/8.5 */
6 public classPerson {7 private int_id;8 privateString name;9 private intage;10 privateString info;11
12 publicPerson(){}13
14 public Person(String name,intage,String info){15 this.name=name;16 this.age=age;17 this.info=info;18 }19
20 public intget_id() {21 return_id;22 }23
24 public void set_id(int_id) {25 this._id =_id;26 }27
28 public intgetAge() {29 returnage;30 }31
32 public void setAge(intage) {33 this.age =age;34 }35
36 publicString getName() {37 returnname;38 }39
40 public voidsetName(String name) {41 this.name =name;42 }43
44 publicString getInfo() {45 returninfo;46 }47
48 public voidsetInfo(String info) {49 this.info =info;50 }51 }
Person.java
这就是全部的代码。
总结
刚开始做的时候忘了实例化DBManager,所以导致无法对数据库进行操作,一直显示的空指针异常,看了好久才发现忘了这一句
dm = new DBManager(this);
对于信息越来越多,数据库的使用越发显得重要。学习android,数据库的学习必不可少。