使用SQLite储存数据

使用SQLite储存数据,第1张

概述一、SQLite简介     SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。   SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分

一、sqlite简介  

  sqlite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。sqlite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。

  sqlite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用sqlite一般只需要带上它的一个动态库,就可以享受它的全部功能。

  数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的 *** 作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。

  sqlite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但是只有一个可以写入数据。在某个进程向数据库执行写 *** 作之前,必须获得独占锁定。在发出独占锁定后,其他的读写 *** 作将不会再发生。

  此外,sqlite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。sqlite数据库还支持大部分 *** 作系统,除电脑上使用的 *** 作系统之外,很多手机上使用的 *** 作系统同样可以运行。同时,sqlite数据库还提供了多语言的编程接口,供开发者使用。


二、建立我们的数据库

  在MysqL等数据库中,第一步是创建数据库,第二步是创建表,如需要,还加上我们的初始预制的数据。在AndroID的sqlite的使用是一样的。稍微特别一点是,我们需要通过继承sqliteOpenHelper这个类来达到目的。对于抽象类sqliteOpenHelper的继承,需要重写构造方法、onCreate()和onUpgrade(),下面举例介绍。

  这个例子,我们创建一个名为bebook_db的数据库,里面有一个叫mytable的表格,有三列:_ID,name,Weight。下面我们将演示如何创建数据库,如何在数据库中创建表,如何删除表,如何更新数据库。

class Chapter22Db extends sqliteOpenHelper{	public static final String DATABASE_BAME ="bebook_db";	// step 1 :重写构造函数中,继承super的构造函数,创建database	public Chapter22Db(Context context){		/* 在super中,		 * 第一个参数 为当前环境		 * 第二个参数 String name为数据库文件,如果数据存放在内存 ,则为null (不建议)		 * 第三个参数 为sqliteDatabase.CursorFactory  factory,存放cursor,缺省设置为null		 * 第四个参数 为int version数据库的版本,从1开始,如果版本旧,则通过onUpgrade()进行更新(升级),		 * 如果版本新则通过onDowngrade()进行发布(降级)。		 * 例如,我要更改mytable表格,增加一列,或者修改初始化的数据,或者程序变得复杂,我需要增加一个表,这时我需要在版本的数字增加		 * 在加载时,才会对sqlite中的数据库个更新,这点非常重要,同时参见onUpgrade()的说明 */		super(context,DATABASE_BAME,null,1);	}	/*step 2 :重写onCreate(),如果AndroID系统中第一次创建我们的数据库时,	 * 即后面介绍调用getWritableDatabase()或者getReadbleDatabase()时,	 * 将调用onCreate(),这这里创建数据库(虽然在构造函数中填入数据库名,但数据库的创建实在onCreate()中自动进行。	 * 在这可以创建table,同时也可以写入初始数据	 * 总而言之,onCreate方法不需要手动调用*/	public voID onCreate(sqliteDatabase db) {		//execsql方法用于执行不需要返回数据的SQL语句		db.execsql("CREATE table mytable(_ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,Weight REAL); ");		//下面是初始化三个原始数据,对表格进行增、删、改、查,后面会详细介绍。		//下面的几个数据来自AndroID自带的重力表,据说是为了传感器管理用,AndroID已经考虑到我们在月球和火星上使用AndroID手机的情况^_^,程序员有时真的很无聊……		//ContentValues是一种键值对应的数据储存结构		ContentValues cv = new ContentValues();		cv.put("name","Gravity,Earth");		cv.put("Weight",SensorManager.GraviTY_EARTH);		db.insert("mytable","name",cv);		cv.put("name",Mars");		cv.put("Weight",SensorManager.GraviTY_MARS);		db.insert("mytable",Moon");		cv.put("Weight",SensorManager.GraviTY_MOON);		db.insert("mytable",cv);	}	/* step 3:重写onUpgrade(),如果版本比原来的高,将调用onUpgrade()	 * 通常,我们会删除原来的表格,再根据新的需求创建*/	public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {		db.execsql("DROP table IF EXISTS mytable");		//删完了,别忘了调用onCreate(db)		onCreate(db);	}}

三、和数据库进行关联

  就如同在MysqL中进行数据库的创建,表格创建和初始数据的填写,而其他的 *** 作一般在Activity中和用户互动产生的。另外在Activity销毁(onDestroy())时,我们需要将连接断开,以释放有关资源。当然了,要不要释放,在哪释放,你来决定。

sqliteDatabase db = null;//获取处理sqliteOpenHelper的子类的sqlite的实例,如果只读,可以采用getReadableDatabase()//下面的例子例子我们将通过sqliteDatabase实例的 *** 作,来进行对数据进行增删改查询,所以采用可写的方式。//简单来说,如果以前从未 *** 作过该数据库,那么通过下面这一语句,数据库和表就已经创建了db= (new Chapter22Db (getApplicationContext())).getWritableDatabase();


四、对表进行 *** 作

  对表格的 *** 作有两种方式,一种是RAW方式,即直接给出SQL语句(也就是前面出现的execsql()方法),另一种是采用sqliteDatabase中给出的方法来进行,姑且称为API方式,这种方法前面已经出现过,即db.insert("mytable",cv)这行。

  RAW方式:

  RAW方式很简单,调用execsql方法进行增加、删除、更新 *** 作均用SQL语句 *** 作,比如:

db.execsql("INSERT INTO mytable(name,Weight) VALUES ('Test1',1.0);");db.execsql("DELETE FROM mytable WHERE name='Test1';");   db.execsql("UPDATE mytable SET Weight=5.0 WHERE name='Test1';");
  上面的三个 *** 作都是无返回值的,而查询SELECT则不然,将返回游标Cursor:
Cursor corsor = db.rawquery("SELECT _ID,name,Weight from mytable",null);
  获取Cursor数据方法:

//移至第一行corsor.movetoFirst();while(!corsor.isAfterLast()){ 	//参数0,即为该行的首列	int ID = corsor.getInt(0); 	//参数为1,即为该行第二列,以此类推	String name = corsor.getString(1);	double weight = corsor.getDouble(2);	//取出的数据怎么处理你来决定	corsor.movetoNext();}//记得关掉corsor.close();  


  API方式:

  API方式中,每一种目的都有不同的方法调用。简单归纳如下:

  insert(String table,String nullColumnHack,ContentValues values)
  第一参数:数据库表名;
  第二个参数如果CONTENT为空时则向表中插入一列什么(亦可为null);
  第三个参数为插入的内容。

  例:db.insert("mytable",values);

  delete(String table,String whereClause,String[] whereArgs)
  第一参数:数据库表名;
  第二个参数表示条件语句(如"sex=?");
  第三个参数为条件带?的替代值,当然也可以直接在第二个参数中填充完毕。

  例:db.delete("mytable","name=?",{"Test1"});

    db.delete("mytable","name="Test1"",null);


  update(String table,ContentValues values,String[] whereArgs)
  第一个参数:数据库表名;
  第二个参数更新的内容;
  第三个参数更新的条件;
  第四个参数条件带?号的替代者,当然也可以直接在第三个参数中填充完毕。

  例:db.update("mytable",values,name);

    db.update("mytable","name="+name,null);


  至于查询方法,也就是query()系列的函数,实在是太多了,大家可以自行查阅官方文档(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html)进行了解,实现方法也是大同小异。


  如果你对SQL语句不熟悉,那么建议你稍微学习下。


以上部分内容转载或参考来源如下:

http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html

http://www.jb51.cc/article/p-nrdlfjdx-baq.html

在此表示感谢。 转载请注明来源,版权归原作者所有,未经同意严禁用于任何商业用途。 微博:http://weibo.com/theworldsong 邮箱:theworldsong@foxmail.com

总结

以上是内存溢出为你收集整理的使用SQLite储存数据全部内容,希望文章能够帮你解决使用SQLite储存数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1173908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存