Android中的SQLite SQLiteOpenHelper SQLiteDatabase及其例子

来源:互联网 发布:当当网买mac靠谱吗 编辑:程序博客网 时间:2024/05/18 02:16

总结一下最近研究的Android中SQLite的使用:参考了《Android应用开发揭秘》及其http://blog.csdn.net/xys289187120/article/details/6661099中的文章

1、SQLite

数据库最经典的四个操作添加(Insert)、删除(delete)、修改(update)、查询(select),在处理大量数据的时候使用数据库可以帮我们迅速定位当前须要处理的数据

2、SQLiteOpenHelper

实际开发中为了更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类。这个类中需要重写两个方法onCreate和onUpgrade。在构造函数时并没有真正的创建数据库,而是在通过继承自SQLiteOpenHelper类的对象调用getWritableDatabase或者getReadableDatabase方法时才真正的创建数据库,并且返回一个SQLiteDatabase类型的对象

3、SQLiteDatabase

我们可以通过SQLiteDatabase的两个接口就可以完成数据库最经典的四个操作添加(Insert)、删除(delete)、修改(update)、查询(select),这两个接口是execSQL和rawQuery,其中添加(Insert)、删除(delete)、修改(update)需要使用execSQL来执行SQL语句,而查询(select)需要使用rawQuery。其实很多教材还介绍了通过SQLiteDatabase的insert、delete、update接口来操作数据库,个人感觉如果对SQL典型的SQL语句比较熟悉的话,还是用execSQL和rawQuery比较好,因为函数的参数直接是SQL语句。

 

最后想通过一个例子更好的记录一下如何使用数据库

 1、layout的xml文件,主要是8个button

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button1"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="创建数据库" />    <Button        android:id="@+id/button2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="删除数据库" />    <Button        android:id="@+id/button3"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="创建表" />        <Button        android:id="@+id/button4"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="删除表" />    <Button        android:id="@+id/button5"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="在表中添加一条数据" />    <Button        android:id="@+id/button6"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="从表中删除一条数据" />    <Button        android:id="@+id/button7"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="在表中修改一条数据" />    <Button        android:id="@+id/button8"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="在表中查找一条数据" /></LinearLayout>

2、MyDatabaseAdapter类中包含所有对数据库操作的接口,外面可以直接调用

public class MyDatabaseAdapter {private final static String DATABASE_NAME = "xys.db";private final static int DB_VERSION = 1;private final static String TABLE_NAME = "";private final static String DB_CREATE_TABLE = "CREATE TABLE test " +"(_id INTEGER PRIMARY KEY AUTOINCREMENT," +"name TEXT,hp INTEGER DEFAULT 100," +"mp INTEGER DEFAULT 100," +"number INTEGER)";public SQLiteDatabase m_SQLiteDatabase = null;public DatabaseHelper m_DatabaseHelper = null;private static class DatabaseHelper extends SQLiteOpenHelper{private static DatabaseHelper mInstance = null; public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DB_VERSION);// TODO Auto-generated constructor stub}static synchronized DatabaseHelper getInstance(Context context) {  if (mInstance == null) {         mInstance = new DatabaseHelper(context);  }  return mInstance;  }  @Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(DB_CREATE_TABLE);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}public MyDatabaseAdapter(Context context){m_DatabaseHelper = DatabaseHelper.getInstance(context);//Create databasem_SQLiteDatabase = m_DatabaseHelper.getWritableDatabase();}public boolean deleteDatabase(Context context) {      return context.deleteDatabase(DATABASE_NAME);      }public void createTable(String sql){m_SQLiteDatabase.execSQL(sql);}public void deleteTable(String sql){m_SQLiteDatabase.execSQL(sql);}public void insertData(String sql){m_SQLiteDatabase.execSQL(sql);}public void deleteData(String sql){m_SQLiteDatabase.execSQL(sql);}public void updateData(String sql){m_SQLiteDatabase.execSQL(sql);}//Select这个比较特殊不能通过execSQL接口执行查询,而要用rawQuery或者public void selectData(String sql){Cursor cursor = m_SQLiteDatabase.rawQuery(sql, null);while (cursor.moveToNext()) {  int id = cursor.getInt(0); //获取第一列的值,第一列的索引从0开始  String name = cursor.getString(1);//获取第二列的值  int number = cursor.getInt(2);//获取第三列的值  }  cursor.close();  m_SQLiteDatabase.close();  }}


 3、Activity:主要是点击8个按钮时调用MyDatabaseAdapter类中的接口进行处理

public class SQLiteActivity extends Activity {    private MyDatabaseAdapter m_MyDatabaseAdapter = null;/** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                Button button1 = (Button)findViewById(R.id.button1);        button1.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);}});                Button button2 = (Button)findViewById(R.id.button2);        button2.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);m_MyDatabaseAdapter.deleteDatabase(SQLiteActivity.this);}});                Button button3 = (Button)findViewById(R.id.button3);        button3.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "create table gameInfo" +"(_id INTEGER PRIMARY KEY," +"name TEXT," +"hp INTEGER DEFAULT 100," +"mp INTEGER DEFAULT 100," +"number INTEGER)";m_MyDatabaseAdapter.createTable(sql);}});        Button button4 = (Button)findViewById(R.id.button4);        button4.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "DROP TABLE gameInfo";m_MyDatabaseAdapter.deleteTable(sql);}});        //Insert        Button button5 = (Button)findViewById(R.id.button5);        button5.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "INSERT INTO gameInfo (_id,name,number) values(1,'luliyuan12',12345)";m_MyDatabaseAdapter.insertData(sql);}});        //Delete        Button button6 = (Button)findViewById(R.id.button6);        button6.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "DELETE FROM gameInfo where _id=1";m_MyDatabaseAdapter.deleteData(sql);}});        //Update        Button button7 = (Button)findViewById(R.id.button7);        button7.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "update gameInfo set number=2381455 where _id=1";m_MyDatabaseAdapter.updateData(sql);}});        //Select        Button button8 = (Button)findViewById(R.id.button8);        button8.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubm_MyDatabaseAdapter = new MyDatabaseAdapter(SQLiteActivity.this);String sql = "select * from gameInfo";m_MyDatabaseAdapter.selectData(sql);}});            }}


 注意:

封装了一个DatabaseHelper类继承SQLiteOpenHelper 使用了设计模式中的单例模式来处理这个类,单例模式是常见的代码设计模式之一,它的好处是在于避免在内存中频繁的实例化所以将它的对象写成static 静态 这样它的对象就只有一份存在静态内存区使用的时候只须要通过getInstance()就可以直接拿到这个静态对象。

原创粉丝点击