SQLite 是一个轻量级的数据库,常用于各种嵌入式设备当中。
android 提供了SQLiteOpenHelper的抽象类用于帮助开发数据库。
在实际使用中经常定义一个类继承SQLiteOpenHelper,并重写构造方法,onCreate()方法和 onUpdate()的方法;
//注意:上面三个方法必须重写:重写构造方法一般用于初始化
onCreate()方法:
onUpdate()用于数据库版本的更新时调用,只在数据库更新时调用一次。
如:MySQLiteHelper类继承SQLiteOpenHelper
// MySQLiteOpenHelper extends SQLiteOpenHelper;
//MySQLiteOpenHelper myhelper;
myhelper = new MySQLiteOpenHelper(contenext);
** SQLiteDatabase是直接操作数据库的对象,可以使用SQLiteOpenHelper的 getReadableDatabase
或getWritableDatabase方法得到SQLiteDatabase对象。
//SQLiteDatabase db = myhelper.getReadableDatabase();
//注意:只有调用了getReadableDatabase()或getWritableDatabase方法,才算真正创建了数据库,接下来就可以使用数据库的各种方法,
处理数据;
查询结果的返回值:Cursor cursor ;Cursor相当于结果集ResulytSet;
Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.
总结:使用SQLite的一般步骤:
a:自定义一个继承SQLiteOpenHelper的类,然后使用数据库帮助类的对象调用getReadableDatabase()或getWritableDatabase方法创建数据库
b: 对数据库db进行增删改查的操作
c:对于查询的结果集储存在Cursor中。
d:数据库db和结果集Cursor使用完毕后注意调用close的方法来释放资源
http://wenku.baidu.com/view/423a00dca58da0116c17491e.html
//该文档比较长比较详细
package com.itheima.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.view.View; public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { /*数据库的构造方法, 用来定义数据库的名称, 数据库的结果集和数据库的版本 创建出一个Person的数据库 */ public PersonSQLiteOpenHelper(Context context) { super(context, "Person.db", null, 1); /* * 一共四个参数,每个参数的含义:1.context上下文,一般都需要 2:数据库的名字 游标工厂:移动的指针指向结果集,一般游标工厂用null; version:代表数据库的版本。从1开始的,一般使用1; */ } /* * 在数据库第一次创建的时候使用onCreate(), * 一般用来创建数据库的表结构和存一些初始化的表参数 * 传入的参数db代表被创建的数据库 * */ @Override public void onCreate(SQLiteDatabase db) { //初始化表结构 db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))"); //注意:SQLite 实际上是一个嵌入式的数据库,没有MySQL那么多的数据类型。 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
以上代码是创建了一个继承了SQLiteOpenHelper的类。
package com.itheima.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.itheima.db.PersonSQLiteOpenHelper; import com.itheima.db.domain.Person; public class PersonDao { //因为要对helper进行操作,所以该类需要有一个helper的对象 private PersonSQLiteOpenHelper helper; public PersonDao(Context context){ helper = new PersonSQLiteOpenHelper(context); } //任何一个函数的构造方法都要传入context的对象,因为context相当于全局变量为整个应用的接口 //这样写代码的好处,在构造方法中已经将personhelper初始化 //养成习惯:只要一拿到数据库就在后面写上close的方法。 public void insert(String name , String num){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("insert into person (name,number) vlaues(?,?) ",new Object[]{name ,num}); db.close(); } //数据库db,只有在helper调用了getWritableDatabase()或者getReadableDatabase()的方法后才会被创建出来 //使用任何一个数据库最后都要关闭数据库来释资源,所以当你在开始创建数据库的时候就直接关闭数据库以防忘记 //数据库db可以调用execSQl的方法来执行SQL语句,SQL语句中的?代表了占位符可以用参数实现 public void delete(String name){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from person where name =?",new Object[]{name}); db.close(); } public void update(String name ,String newname ){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set name =? where name =?",new Object[]{name,newname} ); db.close(); } public boolean find(String name){ SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * from person where name = ?", new String[]{name}); boolean result = cursor.moveToNext(); cursor.close(); db.close(); return result; } //cursor使用完也要关闭来释放资源。cursor的常用方法要掌握 public List<Person> findAll(){ SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.rawQuery("select * from person",null); List<Person> list = new ArrayList<Person>(); while(cursor.moveToNext()){ int id = cursor.getInt(0); String name = cursor.getString(1); String number = cursor.getString(2); Person p = new Person(name,number,id); list.add(p); } cursor.close(); db.close(); return list; } } //以上是使用SQL语句是实现的增删改查 //可以使用Android 提供的API来实现增删改查的 //使用SQL语句比较麻烦,会出现一些小细节的错误
编写一个Dao类用于操作数据库。
package com.itheima.db.domain; public class Person { private String name; private String number; private int id; public Person(String name, String number, int id) { super(); this.name = name; this.number = number; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public int getId() { return id; } public void setId(int id) { this.id = id; } } //创建PersonBean类来封装查询到的结果,快捷键右键source,生成getter 和setter的方法,右键source还可以生成构造方法 //一般 构造方法的作用是初始化对象参数值
//自定义了一个Person类用来封装查询结果。
package com.itheima.db; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(this); /* //只执行以上代码实际数据库并没有被创建出来,单纯的new出来了一个对象 helper.getReadableDatabase(); helper.getWritableDatabase(); //只有执行以上的两种方法中任意一种数据库才被创建出来 */ helper.getReadableDatabase(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
//主函数