一、SQLite 介绍
1、SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
2、QLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。
3、SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。
4、JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。数据库存储在 data/< 项目文件夹 >/databases/ 下。
5、Activites 可以通过 Content Provider 或者 Service 访问一个数据库。下面会详细讲解如果创建数据库,添加数据和查询数据库。
二、SQLite 的使用
Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库的帮助类:
package com.chenchen.shujuku; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { /** *此方法是数据库的构造函数,参数分别代表的是:上下文、数据库的名称、游标工厂(一般为null)、 *数据库的版本(一般从1开始) */ public PersonSQLiteOpenHelper(Context context) { super(context, "person.db", null, 1); } @Override /** * 数据库第一次被调用的时候被调用,一般是对这个数据库填充表和初始化数据 */ public void onCreate(SQLiteDatabase db) { db.execSQL("create table person ( id integer primary key autoincrement,name varchar(20),number varchar(20))"); } /** 当数据库的版本跟新时调用,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数 *据库从旧的模型转变到新的模型。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
在MainActivity中调用帮助类:
package com.chenchen.shujuku; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(this);//此行代码执行后数据库还没有真正被创建 SQLiteDatabase db= helper.getWritableDatabase(); } }
数据库的增删改查方法一:
package com.yejun.shujuku.dao; import java.util.List; import android.R.bool; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.yejun.shujuku.PersonSQLiteOpenHelper; public class PersonDao { private PersonSQLiteOpenHelper helper; public PersonDao(Context context){ helper = new PersonSQLiteOpenHelper(context); } /** * 增加一条记录到数据库 * @param name * @param number */ public void add(String name, String number){ SQLiteDatabase db = helper.getWritableDatabase();//可写 db.execSQL("insert into person(name,number) values (?,?)", new Object[]{name,number});//占位符 db.close();//数据库使用完后一定记得要释放 } /** * 查询数据 * @param name * @return */ public boolean find(String name){ SQLiteDatabase db = helper.getReadableDatabase();//可读 Cursor cursor = db.rawQuery("select *from where name = ?", new String[]{name} ); boolean result = cursor.moveToNext(); cursor.close();//游标记得要释放 db.close(); return result; } /** * 跟新一条记录 * @param name * @param number */ public void update(String name,String newnumber){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set number=? where name =?", new Object[] {newnumber,name }); db.close(); } /** * 删除一条记录 * @param name */ public void delete(String name){ SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("delete from person where name=?", new Object[]{name}); db.close(); } }
数据库的增删改查方法二:
package com.chenchen.shujuku.dao; import java.util.List; import android.R.bool; import android.R.integer; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.inputmethodservice.Keyboard.Row; import com.yejun.shujuku.PersonSQLiteOpenHelper; public class PersonDao2 { private PersonSQLiteOpenHelper helper; public PersonDao2(Context context) { helper = new PersonSQLiteOpenHelper(context); } /** * * 增加一条记录到数据库 * * @param name * @param number * @return the row ID of the newly inserted row, or -1 if an error occurred */ public long add(String name, String number) { SQLiteDatabase db = helper.getWritableDatabase();// 可写 // db.execSQL("insert into person(name,number) values (?,?)", new // Object[]{name,number}); ContentValues cv = new ContentValues(); cv.put("name", name); cv.put("number", number); long id = db.insert("person", null, cv); db.close(); return id; } /** * 查询数据 * * @param name * @return */ public boolean find(String name) { SQLiteDatabase db = helper.getReadableDatabase();// 可读 // Cursor cursor = db.rawQuery("select *from where name = ?",new String[] { name }); Cursor cursor = db.query("person", null, "name=?", new String[] { name }, null, null, null); boolean result = cursor.moveToNext(); cursor.close(); db.close(); return result; } /** * * 跟新一条记录 * * @param name * @param number * @return the number of rows affected */ public int update(String name, String newnumber) { SQLiteDatabase db = helper.getWritableDatabase(); // db.execSQL("update person set number=? where name =?", new Object[] {newnumber,name }); ContentValues values = new ContentValues(); values.put("number", newnumber); int row = db.update("person", values, "name=?", new String[] { name }); db.close(); return row; } /** * 删除一条记录 * @param name * @return the number of rows affected if a whereClause is passed in, 0 otherwise. * To remove all rows and get a count pass "1" as the whereClause. */ public int delete(String name) { SQLiteDatabase db = helper.getWritableDatabase(); //db.execSQL("delete from person where name=?", new Object[] { name }); int row=db.delete("person", "name=?", new String[]{name}); db.close(); return row; } }