SQLite的使用

SQLite的使用,第1张

概述SQLite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源。在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite。SQLite提供SQL接口,和一般的数据库一样。但是Android的API不采用JDBC,JDBC消耗太多的资源。 SQLite支持绝大部分SQL-92标准,不支持:FOREIGN KEY constraints, nes

sqlite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源。在AndroID中,runtime提供sqlite,所以我们可以使用sqlite,而且是全集的sqlite。sqlite提供sql接口,和一般的数据库一样。但是AndroID的API不采用JDBC,JDBC消耗太多的资源。

sqlite支持绝大部分sql-92标准,不支持:FOREIGN KEY constraints,nested transactions,RIGHT OUTER JOIN,FulL OUTER JOIN,and some flavors of ALTER table.而我们在手持终端上使用sqlite,一般并不涉及太复杂的数据库处理,除了上诉,其他的sql,包括tirger、transaction等都是支持,应该说sqlite提供的功能是足够。

和一般的sql数据库比较,最大的差异是数据类型,例如我们定义一个表的某个column的数据类型为INTEGET,如果在插入时这个数值采用String,在sqlite中是包会产生错误,我们可以将定义表格的数据类型作为一个提示,用于说明期待的数据类型,但是并不真实起到检测作用。如果真的需要限制,要以来程序的其他部分进行判断。

1、建立我们的数据库

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

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

/* 对于抽象类sqliteOpenHelper的继承,需要重写:1)constructor,2)onCreate()和onUpgrade() * */
public class Chapter22Db extends sqliteOpenHelper{
public static final String DATABASE_BAME ="bebook_db";

/* step 1 :重写构造函数中,继承super的构造函数,创建database */
public Chapter22Db(Context context){
/* 第一个参数 为当前环境
* 第二个参数 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和写入初始数据*/
public voID onCreate(sqliteDatabase db) {
//创建table:sql的语句是“CREATE table constants(_ID INTEGER PRIMARY KEY autoINCREMENT,Title TEXT,value REAL);”,我们可以直接通过db.execsql(sqlCommand)来执行没有返回值的sql语言,例如CREATE,DELETE,UPDATE,INSERT,DROP。
db.execsql("CREATE table mytable(_ID INTEGER PRIMARY KEY autoINCREMENT,name TEXT,Weight REAL); ");

//下面是加入三个原始数据,如果对表格进行增、删、改、查,后面会详细介绍。下面的几个数据来自AndroID自带的重力表,据说是为了传感器管理用,AndroID已经考虑到我们在月球和火星上使用AndroID手机的情况^_^,程序员有时真的很无聊……
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",cv);

cv.put("name",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(sqlCommand)来执行没有返回值的sql语言,将表格删除
db.execsql("DROP table IF EXISTS mytable");
onCreate(db);
}

}

2、和数据库进行关联

就如同在MysqL中进行来数据库的创建,表格创建和初始数据的填写,其他的 *** 作一般在Activity中和用户互动产生。回忆一下我们在linux环境中如何处理,首先是要创建和数据库的连接,AndroID也一样,另外在Activity结束时,我们需要将连接断开,以释放有关资源。

public class Chapter22Test1 extends ListActivity{
private sqliteDatabase db = null;
private Cursor cursor = null; //在后面与ListVIEw互动中使用

protected voID onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 获取处理sqliteOpenHelper的子类的sqlite的实例,如果只读,可以采用getReadableDatabase(),这个例子我们奖通过sqliteDatabase实例的 *** 作,来进行对数据进行增删改查询,采用可写的方式。
db= (new Chapter22Db (getApplicationContext())).getWritableDatabase();
}

protected voID onDestroy() {
super.onDestroy();
//释放和数据库的连接
db.close();
}
}

3、对表格进行 *** 作

对表格的 *** 作有两种方式,一种是RAW方式,即直接给出SQL语句,另一种是采用sqliteDatabase中给出的方法来进行,姑且称为API方式。下面就这两种方式的增、删、改、查进行实验。

3.1增加一行数据

在设置创建表格时,使用了db.execsql(sqlCommand)来执行没有返回值的sql语言,这个是RAW方式。另一种方式在之前加入原始数据时给出,通过db.insert("mytable",<ContentValues values>);来实现。其中第二个参数比较特别。sql是不运行加入一个空的行。如果第二个参数不设置为null,则对这种情空行情况进行处理,将对应列的值设置为“NulL”。

//RAW方式。
db.execsql("INSERT INTO mytable(name,Weight) VALUES ('Test1',1.0);");
//API方式,通过db.insert("mytable",<ContentValues values>);来处理,其中ContentValues是用于存储名称和数值,对应为表格的列的名词和其在行中的数据。
ContentValues values =new ContentValues(2);//ContentValues有两个数值
values.put("name","Test2"); //一个列名为name,数据为Test2
values.put("Weight",2.0); //一个列名为Weight,数据为2.0
db.insert("mytable",values);

3.2删除一行数据

//RAW方式
db.execsql("DELETE FROM mytable WHERE name='Test1';");
//API方式,方法是:delete (String table,String whereClause,String[] whereArgs)
db.delete("mytable","name=?",{"Test1"});

3.3更新一行数据

//RAW方式
db.execsql("UPDATE mytable SET Weight=5.0 WHERE name='Test1';");
//API方式,方法是:update (String table,ContentValuesvalues,StringwhereClause,String[]whereArgs)
String[] name = {"Test1"};
ContentValues values =new ContentValues(2);

values.put("name","Test1");
values.put("Weight",5.0);

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

3.4查询和游标Cursor

上面的三个 *** 作都是无返回值的,而查询SELECT则不然,将返回游标Cursor。下面是两种方式的查询

//RAW方式,带返回值,采用db.rawquery(SQL语句)方式
Cursor result1 =db.rawquery("SELECT _ID,name,Weight from mytable ORDER BY name",null);

/API方式,带返回值,采用public Cursor query (String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)
String[] columns ={"name","Weight"};
String[] name ={"name"};

Cursor result2 = db.query("mytable",columns,name,null);

游标和Iterator接口有些相似,对于Cursor result我们可以通过下面的方式来读取数据:

result.movetoFirst();
while(!result.isAfterLast()){
int ID = result.getInt(0);
String name = result.getString(1);
double weight = result.getDouble(2);
System.out.println("\t "+ID + "\t["+ name + "]\t" +weight);
result.movetoNext();
}
result.close();

通过Cursor我们可以读取数据库的详细信息,结合到Android学习笔记(二十):回归简单的ListView,我们可以数据用ArrayList<HashMap<>>来存放,由于real非对象,简单地用ArrayList<HashMap<String,String>>来存储。我们已经有能力对sqlite数据进行处理,并也有能力处理ListVIEw,这样可以编写我们的Activity。

然而Cursor中其实已存有信息,我们也可以使用CursorAdapter来处理,在下一次我们将在这个例子的基础上,经CursorAdapter和ListVIEw结合给出例子。

总结

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

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

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

原文地址: https://outofmemory.cn/sjk/1181557.html

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

发表评论

登录后才能评论

评论列表(0条)

保存