`
renyuan_1991
  • 浏览: 69427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQLite详解

阅读更多
概述
    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。SQLite由SQL编译器、内核、后端以及附件组成。
    SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。
    SQLite可以支持高达2TB大小的数据库,每个数据库都是以单个文件的形式存在,这些数据都是以B-Tree的数据结构形式存储在磁盘上。
    在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写操作之前,必须获得独占锁。在获得独占锁之后,其他的读或写操作将不会再发生。
    SQLite采用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,SQLite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。
使用
    SQLiteOpenHelper 类
    用SQLiteOpenHelper 类中的 getWritableDatabase()和getReadableDatabase()方法可以获得数据库的引用。
    通过SQLiteOpenHelper提供的onCreate()和onUpgrade()方法可以对对数据库版本进行管理。onCreate()用于初次使用软件时生成数据库表,onUpgrade()用于升级软件时更新数据库表结构
    当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。
    onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
  onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后做出相应的表结构及数据更新。
     SQLiteDatabase类
     Android提供了一个名为 SQLiteDatabase的类(SQLiteOpenHelper 类中的 getWritableDatabase()和getReadableDatabase()方法返回这个类的对象)。
  SQLiteDatabase类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD)。
  SQLiteDatabase的学习,应该重点掌握execSQL()和rawQuery()方法。
  execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;
  rawQuery()方法用于执行select语句。
简单示例
    第一步:创建DatabaseHelper,它继承SQLiteOpenHelper,并实现了onCreate和onUpgrade方法。
public class DatabaseHelper extends SQLiteOpenHelper {
	// 数据库版本号 
	private static final int DATABASE_VERSION = 1; 
	// 数据库名 
	private static final String DATABASE_NAME = "TestDB.db";
	// 数据表名,一个数据库中可以有多个表(虽然本例中只建立了一个表) 
	public static final String TABLE_NAME = "PersonTable";
	public DatabaseHelper(Context context, String name, CursorFactory factory,
			int version, DatabaseErrorHandler errorHandler) {
		super(context, name, factory, version, errorHandler);
	}

	public DatabaseHelper(Context context, String name, CursorFactory factory,
			int version) {
		/**context:上下文环境 
		 name:数据库名字 
		 factory:游标工厂(可选) 
		 version:数据库模型版本号*/
		super(context, name, factory, version);
	}
	//重写构造函数
	public DatabaseHelper(Context context){
		/**context:上下文环境 
		 name:数据库名字 
		 factory:游标工厂(可选) 
		 version:数据库模型版本号*/
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// 调用时间:数据库第一次创建时onCreate()方法会被调用 
		// onCreate方法有一个 SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据 
		// 这个方法中主要完成创建数据库后对数据库的操作
		System.out.println("---------DatabaseHelper onCreate---------");
		// 构建创建表的SQL语句(可以从SQLite Expert工具的DDL粘贴过来加进StringBuffer中)
		StringBuffer sBuffer = new StringBuffer(); sBuffer.append("CREATE TABLE [" + TABLE_NAME + "] ("); 
		sBuffer.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "); //这个字段名字必须是_id而且不管有没有用都不可省略
		sBuffer.append("[name] TEXT,");
		sBuffer.append("[age] INTEGER,"); 
		sBuffer.append("[info] TEXT)"); 
		// 执行创建表的SQL语句 
		db.execSQL(sBuffer.toString()); 
		// 即便程序修改重新运行,只要数据库已经创建过,就不会再进入这个onCreate方法
		System.out.println("---------DatabaseHelper 创建数据库成功---------");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
		// 调用时间:如果DATABASE_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade 
		// onUpgrade方法的三个参数,一个 SQLiteDatabase对象,一个旧的版本号和一个新的版本号 
		// 这样就可以把一个数据库从旧的模型转变到新的模型 
		// 这个方法中主要完成更改数据库版本的操作 
		System.out.println("----------DatabaseHelper onUpgrade----------");
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); 
		// 上述做法简单来说就是,通过检查常量值来决定如何,升级时删除旧表,然后调用onCreate来创建新表 
		// 一般在实际项目中是不能这么做的,正确的做法是在更新数据表结构时,还要考虑用户存放于数据库中的数据不丢失
	}
	
	private void onpen() {
		System.out.println("--------open databaseHelper-------");
	}
}

    第二步:添加插入方法
   
public DBManager(Context context){
		helper = new DatabaseHelper(context);
		// 因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
		//所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
		db = helper.getWritableDatabase();
	}

    public void add(List<Person> persons){
		db.beginTransaction();
		try {
			for(Person person : persons){
				// 带两个参数的execSQL()方法,采用占位符参数.把参数值放在后面,顺序对应. 
				// 一个参数的execSQL()方法中,用户输入特殊字符时需要转义,使用占位符有效区分了这种情况
				db.execSQL("INSERT INTO "+DatabaseHelper.TABLE_NAME+" VALUES(null,?,?,?)",new Object[]{person.name,person.age,person.info});
			}
			db.setTransactionSuccessful(); // 设置事务成功完成
			System.out.println("设置事务成功完成");
		}finally{
            db.endTransaction(); // 结束事务(不主动结束事物以上的操作不会生效)
			System.out.println("endTransaction");
		}
	}

    在Activity中添加数据
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//使用数据库
		DBManager mydb = new DBManager(this);
		Person person1 = new Person("张3",38,"是个好");
		Person person2 = new Person("张4",48,"是个好人");
		Person person3 = new Person("张5",58,"真是个好人");
		List<Person> myp = new ArrayList<Person>();
		myp.add(person1);
		myp.add(person2);
		myp.add(person3);
		mydb.add(myp);
	}

    数据库简单的插入操作如上,后续会持续更新数据库相关的信息


            转载请注明出处:[url]http://renyuan-1991.iteye.com/blogs/2246715 [/url]
    希望爱好编程的小伙伴能加这个群,互相帮助,共同学习。群号: 141877583
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics