一、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方式中,每一种目的都有不同的方法调用。简单归纳如下:
第一参数:数据库表名;
第二个参数如果CONTENT为空时则向表中插入一列什么(亦可为null);
第三个参数为插入的内容。
例:db.insert("mytable",values);
第一参数:数据库表名;
第二个参数表示条件语句(如"sex=?");
第三个参数为条件带?的替代值,当然也可以直接在第二个参数中填充完毕。
例:db.delete("mytable","name=?",{"Test1"});
db.delete("mytable","name="Test1"",null);
第一个参数:数据库表名;
第二个参数更新的内容;
第三个参数更新的条件;
第四个参数条件带?号的替代者,当然也可以直接在第三个参数中填充完毕。
例: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储存数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)