sqlite 轻量级数据库,对多数用户仅仅表现为数据库文件而已
占用资源非常低,占用的内存空间可能只需要几百KB,多用于嵌入式产品
执行效率高
sqlite数据库相当于是每个应用的私有数据,应用程序卸载,对应的sqlite文件也被删除
sqlite是无类型的:即在创建数据库表时可用不用指定字段(列)的数据类型
任意数据类型的数据都可以保存到任意的字段(列)中,但仍然强烈推荐开发人员在创建数据表时指定数
据类型,并合理的填充数据
以便于开发人员之间的交流,及可能存在的数据库引擎更换
2 创建数据库和数据表
创建数据库的方式有:
(1)调用openOrCreateDatabase()方法;(不常用)
(2)扩展sqliteOpenHelper类
方法一openOrCreateDatabase()
·调用ContextWrapper类定义的openOrCreateDatabase()方法即可打开
或创建数据库,即:
如果指定的数据库不存在,则先创建它,然后再打开;
如果指定的数据已经存在,则直接打开它
该方法的签名如下:
public sqliteDatabase openOrCreateDatabase(String name,int mode,CursorFactory factory)
参数 1数据库文件名xxx.db,
参数2 文件的操作类型
参数3游标工厂,暂时不需要传入null就行
sqliteDatabase类
·sqliteDatabase类是在Android系统中用于执行各种相关操作的类例如创建数据表,对数据进行增删改查,执行事务等。
·调用该类的execsql()方法执行无需返回结果的sql指令,该方法签名,
如下:
public void execsql(String sql) throws sqlException
创建数据表:
·使用一般的创建数据表的sql语法即可创建数据表,如果表名,字段名可
能与关键字冲突,可使用方括号:
CREATE TABLE [students](
[_id] INTEGER PRIMARY KEY AUTOINCREMENT,
[_name]VARCHAR(50) UNIQUE NOT NULL,
[_age] INT NOT NULL DEFAUL 15
)
方法二 扩展sqliteOpenHelper类(抽象类)
·使用sqliteOpenHelper类的相关方法也可以获取sqliteDatabase类的对象,以实现数据表,数据的相关
操作;
·sqliteOpenHelper可更方便的实现数据库的初始化,版本更新等问题。
·sqliteOpenHelper类是抽象类,并且没有无参的构造方法,因此,开发人员定义其子类时,需要在子类
的构造方法中显示的调用给构造方法;
·构造方法签名:
public sqliteOpenHelper(Context context,String name,CursorFactory factory,int version)
1,上下文对象
2,数据库文件名
3 游标
4 版本(应该一次比一次大,新版本要比老版本数值要大)
·调用sqliteOpenHelper类的如下方法可获取sqliteDatabase对象:
·public synchronized sqliteDatabase getReadableDatabase()
·public synchronized sqliteDatebase getWritableDatabase()
子类继承扩展sqliteOpenHelper类,子类的对象只有调用上面这两个方法中的任意一个
之后才有可能执行子类中的构造方法和重写的方法
(注意区别:getReadableDatabase()扔尝试获取一个可执行写操作的数据库访问对象
(等效于getWritableDatabase()方法)),仅当出现意外时,例如磁盘空间已满,
则获取只读的数据库访问对象。
·当第一次调用以上方法时,onCreate(),onUpgrade()方法可能被调用,
而这两个方法可能耗时比较长的执行时间,因此并不推荐在主线程中调用
以上方法
实现:
第一步
创建类DBOpenHelper继承sqliteOpenHelper
package com.example.sqlite_test; import android.content.Context; import android.database.sqlite.sqliteDatabase; import android.database.sqlite.sqliteDatabase.CursorFactory; import android.database.sqlite.sqliteOpenHelper; public class DBOpenHelper extends sqliteOpenHelper{ /* * 重写构造方法 * */ public DBOpenHelper(Context context) { super(context,"tarena2.db",null,1); // TODO Auto-generated constructor stub } @Override public void onCreate(sqliteDatabase db) { // TODO Auto-generated method stub //创建数据库表students表 String sql = "CREATE TABLE [students] (" +"[_id] INTEGER PRIMARY KEY AUTOINCREMENT," + "[_name] VARCHAR(50) UNIQUE NOT NULL," +"[_age] INT NOT NULL DEFAULT 16" +")"; db.execsql(sql); } @Override public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) { // TODO Auto-generated method stub } }
第二步:在MainActivity中
package com.example.sqlite_test; import android.os.Bundle; import android.app.Activity; import android.database.sqlite.sqliteDatabase; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DBOpenHelper helper = new DBOpenHelper(this); helper.getReadableDatabase(); /* * 下面注释部分是使用第一种方法创建数据库和数据表如果下面的语句执行两次的话就会报错,同一个名字的数据库表(表名相同)不能多次创建会冲突 * */ //创建数据库 // sqliteDatabase db; // db = openOrCreateDatabase("tarena.db",MODE_PRIVATE,null); // // //创建数据库表students表 // String sql = "CREATE TABLE [students] (" // +"[_id] INTEGER PRIMARY KEY AUTOINCREMENT," // + "[_name] VARCHAR(50) UNIQUE NOT NULL," // +"[_age] INT NOT NULL DEFAULT 16" // +")"; // // // db.execsql(sql); } }