android SQL数据库初级操作

来源:互联网 发布:php数组键不为数字 编辑:程序博客网 时间:2024/06/06 11:35

在Android开发 中,数据库是不可缺少的。在Android开发中,用的是一种小型的嵌入式数据库,sqllite。今天会写两篇关于Android开发环境下数据库开发的文章,第一篇先介绍使用android自带的API来实现数据库的使用和管理以及增删改查、数据库升级的相关操作。

一、数据库第一次生成

1、javabean文件的准备

这里以一个Person类为例子来描述
package com.example.freedomsql.bean;import java.io.Serializable;/** * @ClassName: Person * @author victor_freedom (x_freedom_reddevil@126.com) * @createddate 2015-1-10 下午4:22:09 * @Description: TODO */public class Person implements Serializable {private int id;private String name;private String number;// private String nickname;public Person(int id, String name, String number) {super();this.id = id;this.name = name;this.number = number;// this.nickname = nickname;}}

2、数据库类的编写

要实现一个数据库的使用,需要新建一个类并继承SQLiteOpenHelper类。然后实现一个构造方法,详情看代码
package com.example.freedomsql.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * @ClassName: FreedomDB * @author victor_freedom (x_freedom_reddevil@126.com) * @createddate 2015-1-10 下午2:49:15 * @Description: TODO */public class FreedomDB extends SQLiteOpenHelper {public FreedomDB(Context context) {// 参数依次为:上下文,数据库名称,游标工厂一般为NULL,数据库版本号,升级的时候需要更改super(context, "freedom.db", null, 1);}/** * 第一次创建数据库的时候触发该方法 */@Overridepublic void onCreate(SQLiteDatabase db) {//sql语句详情请参考该系列文章第一篇db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");}/** * 数据库版本号变化的时候触发该方法 */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {// if (oldversion == 1 && newversion == 2) {// db.execSQL("alter table person add nickname varchar(20)");// }}}

3、数据库操作类dao类编写

数据库创建完成之后,需要有一个操作类来实现对数据库的操作,一般命名为dao类。详情请参考代码:
package com.example.freedomsql.db.dao;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.freedomsql.bean.Person;import com.example.freedomsql.db.FreedomDB;/** * @ClassName: PersonDao * @author victor_freedom (x_freedom_reddevil@126.com) * @createddate 2015-1-10 下午2:30:24 * @Description: TODO */public class PersonDao {private FreedomDB dbHelper;public PersonDao(Context context) {dbHelper = new FreedomDB(context);}/** * @Title: add * @Description:增加 * @param name * @param number * @throws */public void add(String name, String number) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.execSQL("insert into person(name,number) values (?,?)",new Object[] { name, number });db.close();// 系统API// ContentValues = values = new ContentValues();// values.put("name",name);// values.put("number",number);// long id = db.insert(table(表名),null,values(数据));// return id;}///**// * @Title: add// * @Description: 升级后的增加方法// * @param name// * @param number// * @param nickname// * @throws// *///public void add(String name, String number, String nickname) {//SQLiteDatabase db = dbHelper.getWritableDatabase();//db.execSQL("insert into person(name,number,nickname) values (?,?,?)",//new Object[] { name, number, nickname });//db.close();//// 系统API//// ContentValues = values = new ContentValues();//// values.put("name",name);//// values.put("number",number);//// long id = db.insert(table(表名),null,values(数据));//// return id;////}/** * @Title: delete * @Description: 删除 * @param name * @throws */public void delete(String name) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.execSQL("delete from person where name=?", new Object[] { name });// 系统API// int number=db.delete("person","name=?",new String[]{name});db.close();}/** * @Title: updata * @Description: 更新 * @param name * @param newnumber * @throws */public void updata(String name, String newnumber) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.execSQL("update person set number=? where name=?", new Object[] {newnumber, name });// 系统API// ContentValues values = new ContentValues();// values.put("number", newnumber);// int num = db.update("person", values, "name=?", new String[] { name// });db.close();}/** * @Title: find * @Description: 查询 * @param name * @return * @throws */public boolean find(String name) {SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person where name =?",new String[] { name });// 系统API// Cursor cursor = db.query(table(表名),null,"name=?",new// String[](name),null,null,null);boolean result = cursor.moveToNext();cursor.close();db.close();return result;}/** * @Title: findAll * @Description:查询 * @return * @throws */public List<Person> findAll() {List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person", null);// 系统API// Cursor cursor= db.query("Person",new// String[]{"name","id","number"},null,null,null,null,null);while (cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));String number = cursor.getString(cursor.getColumnIndex("number"));// String nickname = cursor.getString(cursor// .getColumnIndex("nickname"));Person p = new Person(id, name, number);persons.add(p);}cursor.close();db.close();return persons;}}

4、主Activity内代码

在activity内我们使用dao类对数据库进行操作。
package com.example.freedomsql;import com.example.freedomsql.db.dao.PersonDao;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.os.Build;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);PersonDao dao = new PersonDao(getBaseContext());dao.add("汤老板", "110");dao.add("郭大侠", "119");// dao.add("汤老板1", "110", "汤老板");// dao.add("郭大侠1", "119", "郭女侠");}}
这里只对插入数据进行了操作,有兴趣的同学可以自己测试其他的操作也可以在dao类写其他的方法进行更复杂的操作。代码执行后数据库内容显示如图\ 

二、数据库升级更新

在实际开发中,数据库肯定会有升级相关的操作,但是,数据库的升级自然不可以让项目之前的数据清掉,必须保留,所以,这需要对数据库版本号进行一定的控制和处理。那么我们来对刚刚的数据库进行升级处理

1、person类的升级,增加一个nickname字段

package com.example.freedomsql.bean;import java.io.Serializable;/** * @ClassName: Person * @author victor_freedom (x_freedom_reddevil@126.com) * @createddate 2015-1-10 下午4:22:09 * @Description: TODO */public class Person implements Serializable {private int id;private String name;private String number;private String nickname;public Person(int id, String name, String number, String nickname) {super();this.id = id;this.name = name;this.number = number;this.nickname = nickname;}}

2、数据库生成类的改动

1、将版本号更改为2
public FreedomDB(Context context) {// 参数依次为:上下文,数据库名称,游标工厂一般为NULL,数据库版本号,升级的时候需要更改super(context, "freedom.db", null, 2);}


2、在onUpgrade方法中进行处理,在实际开发中,特别需要对版本号进行逻辑处理。
/** * 数据库版本号变化的时候触发该方法 */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {if (oldversion == 1 && newversion == 2) {db.execSQL("alter table person add nickname varchar(20)");}}

3、Dao类的修改

1、增加方法的改动
/** * @Title: add * @Description: 升级后的增加方法 * @param name * @param number * @param nickname * @throws */public void add(String name, String number, String nickname) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.execSQL("insert into person(name,number,nickname) values (?,?,?)",new Object[] { name, number, nickname });db.close();// 系统API// ContentValues = values = new ContentValues();// values.put("name",name);// values.put("number",number);// long id = db.insert(table(表名),null,values(数据));// return id;}

2、查询方法的改动
/** * @Title: findAll * @Description:查询 * @return * @throws */public List<Person> findAll() {List<Person> persons = new ArrayList<Person>();SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person", null);// 系统API// Cursor cursor= db.query("Person",new// String[]{"name","id","number"},null,null,null,null,null);while (cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));String number = cursor.getString(cursor.getColumnIndex("number"));String nickname = cursor.getString(cursor.getColumnIndex("nickname"));Person p = new Person(id, name, number,nickname);persons.add(p);}cursor.close();db.close();return persons;}

4、主Activity的修改

package com.example.freedomsql;import com.example.freedomsql.db.dao.PersonDao;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.os.Build;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);PersonDao dao = new PersonDao(getBaseContext());dao.add("汤老板1", "110", "汤老板");dao.add("郭大侠1", "119", "郭女侠");}}

这样就完成了对数据库升级之后的操作,我们来看下升级后的数据库内容  从图我们可以看到,之前有的数据还存在,没有清除掉,新增加的字段增加进去了,新创建的对象也创建成功。 
在Android开发中sqlite数据库的基础操作介绍完毕,当然,在实际开发中,我们不会这样去操作,有很多封装好了的框架给我们去使用,而且性能极大的优化,操作简便。学习这些基础开发,是为了让我们更加清晰的知道数据库底层的操作原理。所有的数据库操作框架基本上都是基于这套理论去实现的。了解这些后我们再去学习框架的使用,会容易上手。 
0 0
原创粉丝点击