使用SQLite储存数据

来源:互联网 发布:als算法 与svd 编辑:程序博客网 时间:2024/04/30 09:20

一、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的构造函数,创建databasepublic 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", "Gravity, Mars");cv.put("Weight", SensorManager.GRAVITY_MARS);db.insert("mytable", "Name", cv);cv.put("Name", "Gravity, Moon");cv.put("Weight", SensorManager.GRAVITY_MOON);db.insert("mytable", "Name", 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", "Name", 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",null,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 whereClause, String[] whereArgs)
  第一个参数:数据库表名;
  第二个参数更新的内容;
  第三个参数更新的条件;
  第四个参数条件带?号的替代者,当然也可以直接在第三个参数中填充完毕。

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

    db.update("mytable",values,"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://blog.csdn.net/flowingflying/article/details/6841070

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

原创粉丝点击