轻型数据库SQLite与Android实例

来源:互联网 发布:赤平投影图软件 编辑:程序博客网 时间:2024/05/02 04:29
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。SQLite3支持 NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息。

SQLite特性:

1. ACID事务   2. 零配置 – 无需安装和管理配置   3. 储存在单一磁盘文件中的一个完整的数据库   

4. 数据库文件可以在不同字节顺序的机器间自由的共享   5. 支持数据库大小至2TB   6. 足够小, 大致3万行C代码, 250K   7. 比一些流行的数据库在大部分普通数据库操作要快   8. 简单, 轻松的API   9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定   10. 良好注释的源代码, 并且有着90%以上的测试覆盖率   11. 独立: 没有额外依赖   12. Source完全的Open, 你可以用于任何用途, 包括出售它   13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python。

SQLiteOpenHelper

     SQLiteOpenHelper是一个很好的辅助类,简化了数据库的操作。按照Android SDK文档中的说明,可以通过继承此类、改写其接口的方法来实现对数据库的操作,SQLiteOpenHelper主要方法如下:

synchronized void

close()  Close any open database object.

synchronized SQLiteDatabase

getReadableDatabase()  Create and/or open a database.

synchronized SQLiteDatabase

getWritableDatabase()  Create and/or open a database that will be used for reading and writing.

abstract void

onCreate(SQLiteDatabase db)  Called when the database is created for the first time.

void

onOpen(SQLiteDatabase db)  Called when the database has been opened.

abstract void

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

Called when the database needs to be upgraded.

SQLiteDatabase:

   Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加 (Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。对 SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。 execSQL()方法可以执行insert、 delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法可以执行select语句。其主要方法如下:

返回值

方法

long

insert(String table, String nullColumnHack, ContentValues values)Convenience method for inserting a row into the database.

int

delete(String table, String whereClause, String[] whereArgs)Convenience method for deleting rows in the database.

Cursor

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)Query the given table, returning a Cursor over the result set.

int

update(String table, ContentValues values, String whereClause, String[] whereArgs)Convenience method for updating rows in the database.

 

下面是一个简单的例子:

    DatabaseHelper为SQLite的工具类,SQLiteActivity为具体数据操作的Activity类,mian.xml布局文件有六个按钮,增删改查以及表创建与更新。

-------------------------DatabaseHelper-------------------------

package cn.com.pan.DB;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DatabaseHelper extends SQLiteOpenHelper {
 private static final int VERSION = 1;
 //在SQLiteOepnHelper的子类当中,必须有该构造函数
 public DatabaseHelper(Context context, String name, CursorFactory factory,
   int version) {
  //必须通过super调用父类当中的构造函数
  super(context, name, factory, version);
  // TODO Auto-generated constructor stub
 }
 public DatabaseHelper(Context context,String name){
  this(context,name,VERSION);
 }
 public DatabaseHelper(Context context,String name,int version){
  this(context, name,null,version);
 }
 //该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法
 @Override
 public void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub
  System.out.println("create a Database");
  //execSQL函数用于执行SQL语句
  db.execSQL("create table user(id int,name varchar(20))");
 }
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub
  //这里简单处理下,只打印了一句话,用作测试。
  System.out.println("update a Database");
 }
}
----------------------------------SQLiteActivity-------------------------------
package cn.com.pan;
import cn.com.pan.DB.DatabaseHelper;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SQLiteActivity extends Activity {
 private Button createButton;
 private Button insertButton;
 private Button updateButton;
 private Button updateRecordButton;
 private Button queryButton;
 private Button deleteButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        createButton = (Button)findViewById(R.id.createDatabase);
        updateButton = (Button)findViewById(R.id.updateDatabase);
        insertButton = (Button)findViewById(R.id.insert);
        updateRecordButton = (Button)findViewById(R.id.update);
        deleteButton = (Button)findViewById(R.id.delete);
        queryButton = (Button)findViewById(R.id.query);
        createButton.setOnClickListener(new CreateListener());
        updateButton.setOnClickListener(new UpdateListener());
        insertButton.setOnClickListener(new InsertListener());
        updateRecordButton.setOnClickListener(new UpdateRecordListener());
        queryButton.setOnClickListener(new QueryListener());
        deleteButton.setOnClickListener(new DeleteListener());
    }
    class CreateListener implements OnClickListener{
  @Override
  public void onClick(View v) {
   Toast.makeText(SQLiteActivity.this,"创建一个DatabaseHelper对象", Toast.LENGTH_SHORT).show();
   //创建一个DatabaseHelper对象
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
   //只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库
   SQLiteDatabase db = dbHelper.getReadableDatabase();
  }
    }
    class UpdateListener implements OnClickListener{
  @Override
  public void onClick(View v) {
   Toast.makeText(SQLiteActivity.this,"更新DatabaseHelper对象", Toast.LENGTH_SHORT).show();
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db",2);
   SQLiteDatabase db = dbHelper.getReadableDatabase();
  }
    }
    class InsertListener implements OnClickListener{
  @Override
  public void onClick(View v) {
   Toast.makeText(SQLiteActivity.this,"插入数据", Toast.LENGTH_SHORT).show();
   //生成ContentValues对象
   ContentValues values = new ContentValues();
   //想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
   values.put("id", 1);
   values.put("name","pan");
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db",2);
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   //调用insert方法,就可以将数据插入到数据库当中
   db.insert("user", null, values);
  }
    }
    //更新操作就相当于执行SQL语句当中的update语句
    class UpdateRecordListener implements OnClickListener{
  @Override
  public void onClick(View arg0) {
   // TODO Auto-generated method stub
   Toast.makeText(SQLiteActivity.this,"更新数据", Toast.LENGTH_SHORT).show();
   //得到一个可写的SQLiteDatabase对象
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   ContentValues values = new ContentValues();
   values.put("name", "zhangsan");
   //第一个参数是要更新的表名
   //第二个参数是一个ContentValeus对象
   //第三个参数是where子句
   db.update("user", values, "id=?", new String[]{"1"});
  }
    }
    class QueryListener implements OnClickListener{
  @Override
  public void onClick(View v) {
   System.out.println("--------query----------");
   Log.d("myDebug", "myFirstDebugMsg");
   Toast.makeText(SQLiteActivity.this,"查询数据", Toast.LENGTH_SHORT).show();
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
   SQLiteDatabase db = dbHelper.getReadableDatabase();
   Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
   while(cursor.moveToNext()){
    int id = cursor.getInt(cursor.getColumnIndex("id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
    System.out.println("id---" +id+"  name---" + name);
   }
  }
    }
    class DeleteListener implements OnClickListener{
  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   System.out.println("----delete---");
   Toast.makeText(SQLiteActivity.this,"删除数据", Toast.LENGTH_SHORT).show();
   DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_db");
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   //删除记录
   db.delete("user","id=?", new String[]{"1"});
  }
    }
}
------------------------------------main.xml---------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <TextView android:layout_width="fill_parent"
  android:layout_height="wrap_content" android:text="@string/hello" />
 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
  android:layout_weight="1">
  <TableRow>
   <Button android:id="@+id/createDatabase" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="创建数据库" />
   <Button android:id="@+id/updateDatabase" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="更新数据库" />
  </TableRow>
  <TableRow>
   <Button android:id="@+id/insert" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="插入" />
   <Button android:id="@+id/update" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="更新" />
  </TableRow>
  <TableRow>
   <Button android:id="@+id/query" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="查询" />
   <Button android:id="@+id/delete" android:layout_width="150dip"
    android:layout_height="wrap_content" android:text="删除" />
  </TableRow>
 </TableLayout>
</LinearLayout>