一、什么是SQLite
SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。它在2000年由D. Richard Hipp发布,可以支援Java、Net、PHP、Ruby、Python、Perl、C等几乎所有的现代编程语言,支持Windows、Linux、Unix、Mac OS、Android、IOS等几乎所有的主流操作系统平台。
SQLite被广泛应用的在苹果、Adobe、Google的各项产品。如果非要举一个你身边应用SQLite的例子的话,如果你的机器中装的有迅雷,请打开迅雷安装目录,搜索一下sqlite3.dll,是不是找到了它的身影? 如果你装的有金山词霸,那么打开他的安装目录也会看到sqlite.dll的存在。是的,SQLite早就广泛的应用在我们接触的各种产品中了,当然我们今天学习它,是因为在Android开发中,Android推荐的数据库,也是内置了完整支持的数据库就是SQlite。
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
二、SQLiteDatabase类和SQLiteOpenHelper类
(1)SQLiteDatabase类:提供了一系列管理SQLite数据库的方法。而且要对数据库操作的话,必须得到SQLiteDatabase对象。
(2)SQLiteOpenHelper类:作为一个助手类,用来获得SQLiteDatabase对象。它提供两个方面的功能:
1. getReadableDatabase()或者getWritableDatabase()方法来得到SQLiteDatabase对象,通过该对象可以对SQLite数据库进行操作。
2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作。
因此,SQLite、SQLiteDatabase、SQLiteOpenHelper的关系描述如下。
SQLiteOpenHelper---获得-->SQLiteDatabase---操作-->SQLite数据库。
也就是说,首先得到一个SQLiteOpenHelper对象,然后通过该对象的getReadableDatabase()或者getWritableDatabase()方法来得到SQLiteDatabase对象,然后再用SQLiteDatabase对象对SQLite数据库进行操作。
接下来用一个小工程演示下:
step1:新建android工程,命名为TestSQLite,工程目录如下图所示:
step2:设置布局文件main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent"> 6 <Button 7 android:id="@+id/createdatabase" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="createDatabase"/> 11 12 <Button 13 android:id="@+id/updatedatabase" 14 android:layout_width="fill_parent" 15 android:layout_height="wrap_content" 16 android:text="updateDatabase"/> 17 18 <Button 19 android:id="@+id/insert" 20 android:layout_width="fill_parent" 21 android:layout_height="wrap_content" 22 android:text="insert"/> 23 24 <Button 25 android:id="@+id/update" 26 android:layout_width="fill_parent" 27 android:layout_height="wrap_content" 28 android:text="update"/> 29 30 <Button 31 android:id="@+id/delete" 32 android:layout_width="fill_parent" 33 android:layout_height="wrap_content" 34 android:text="delete"/> 35 36 <Button 37 android:id="@+id/query" 38 android:layout_width="fill_parent" 39 android:layout_height="wrap_content" 40 android:text="queryTheCursor"/> 41 42 <ListView 43 android:id="@+id/listView" 44 android:layout_width="fill_parent" 45 android:layout_height="wrap_content"/> 46 47 </LinearLayout>
step3:创建抽象辅助类SQLiteOpenHelper的子类
1 package com.cb.sqlite1; 2 3 4 import android.content.Context; 5 import android.database.sqlite.SQLiteDatabase; 6 import android.database.sqlite.SQLiteDatabase.CursorFactory; 7 import android.database.sqlite.SQLiteOpenHelper; 8 import android.util.Log; 9 10 public class DBHelper extends SQLiteOpenHelper{ 11 12 13 private static String DATABASE_NAME = "test.db"; 14 private static int VERSION = 1; 15 private String tag = "DBHelper"; 16 17 //在SQLiteOpenHelper的子类中,必须有构造函数 18 public DBHelper(Context context, String name, CursorFactory factory, 19 int version) { 20 //必须调用父类的构造函数 21 super(context, name, factory, version); 22 } 23 24 public DBHelper(Context context, int version) { 25 this(context, DATABASE_NAME, null, version); 26 } 27 28 public DBHelper(Context context) { 29 this(context, VERSION); 30 } 31 32 33 34 35 //该函数在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabase对象的时候,才会调用这个方法 36 @Override 37 public void onCreate(SQLiteDatabase db) { 38 db.execSQL("create table user (id int ,name varchar(20))"); 39 Log.i(tag, "database onCreate()"); 40 } 41 42 //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade 43 @Override 44 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 45 Log.i(tag, "database onUpgrade()"); 46 } 47 48 }
step4:TestSQLite.java
package com.cb.sqlite1; 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; public class TestSQLite extends Activity { private Button mCreateDatabaseBtn; private Button mUpdateDatabaseBtn; private Button mInsertBtn; private Button mUpdateBtn; private Button mDeleteBtn; private Button mQueryBtn; private String tag = "TestSQLite"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mCreateDatabaseBtn = (Button)findViewById(R.id.createdatabase); mUpdateDatabaseBtn = (Button)findViewById(R.id.updatedatabase); mInsertBtn = (Button)findViewById(R.id.insert); mUpdateBtn = (Button)findViewById(R.id.update); mDeleteBtn = (Button)findViewById(R.id.delete); mQueryBtn =(Button)findViewById(R.id.query); mCreateDatabaseBtn.setOnClickListener(new CreateDatabaseListener()); mUpdateDatabaseBtn.setOnClickListener(new UpdateDatabaseListener()); mInsertBtn.setOnClickListener(new InsertListener()); mUpdateBtn.setOnClickListener(new UpdateListener()); mDeleteBtn.setOnClickListener(new DeleteListener()); mQueryBtn.setOnClickListener(new QueryListener()); } class CreateDatabaseListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "CreateDatabaseListener"); DBHelper helper = new DBHelper(TestSQLite.this); SQLiteDatabase db = helper.getWritableDatabase(); } } class UpdateDatabaseListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "UpdateDatabaseListener"); DBHelper helper = new DBHelper(TestSQLite.this, 2); SQLiteDatabase db = helper.getWritableDatabase(); } } class InsertListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "InsertListener"); DBHelper helper = new DBHelper(TestSQLite.this); SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("id", 1); values.put("name", "cb"); //发现插入数据时,也会调用onUpgrade()方法 db.insert("user", null, values); } } class UpdateListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "UpdateListener"); DBHelper helper = new DBHelper(TestSQLite.this); SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "hello,cb"); db.update("user", values, "id = ?", new String[]{"1"}); } } class DeleteListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "DeleteListener"); DBHelper helper = new DBHelper(TestSQLite.this); SQLiteDatabase db = helper.getWritableDatabase(); db.delete("user", "id = ?", new String[]{"1"}); } } class QueryListener implements OnClickListener { @Override public void onClick(View v) { Log.i(tag, "QueryListener"); DBHelper helper = new DBHelper(TestSQLite.this); SQLiteDatabase db = helper.getWritableDatabase(); /* * Cursor类 * 游标刚开始时,处于第一条记录的上方。 * cursor.moveToNext()作用: * 1.将游标向下挪动一位 * 2.判断当前游标位置下方是否还有数据 * */ Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); System.out.println("query--->"+name); } } } }
step5:执行结果如下
ps:通过adb查看数据库(adb调试工具,让我们可以以linux的方式调试程序)
一些SQLite操作命令:
1.adb shell--------进入了linux命令行,就可以使用linux命令操作android环境。
2.cd data/data/包名--------进入相应目录
3.ls --------查看文件,可以看到数据库
4.sqlite3 数据库名--------进入数据库命令环境,访问数据库
5. .schema --------查看数据库下的信息