关于android中SQLite基本操作

        这周学习了有关SQLite的相关知识,一方面是为了总结,另一方面想和各位android粉分享一下,共同学习进步,其中不足之处还望见谅。。

首先,何为SQLite?SQLite是一种嵌入式的数据引擎,占用资源很少,因此广泛用于嵌入式设备中。相当于android设备的一个内置的轻量级数据库,方便对于手机本地数据量不大,关系简单的数据进行相应操作。android系统主要通过SQLiteDatabase类、SQLiteOpenHelper类和Cursor接口来对该数据库进行操作,可以完成数据的增加、删除、更新和查找等基本操作,同时也可以执行相应的SQL语句。

SQLite数据库的创建

数据库的创建有两种方法,对数据库进行操作时,可直接通过openOrCreateDatabase()方法创建一个SQLiteDatabase类型的数据库对象,如果了解数据库的人就可直接利用对象的execSQL()方法执行SQL语句对数据库对象进行操作了,当然也可以用已封装好的方法,如:insert()、delete()、query()、update(),这些在后面将进行详细介绍。

如:

String DATABASE_NAME="mydb.db";
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);

这里第一个参数是数据库名称;第二个参数是打开或创建模式,可取MODE_WORLD_READABLE(所有应用程序均可读)、MODE_WORLD_WRITEABLE(所有应用程序均可写)、MODE_PRIVATE(私有的);第三个参数为Cursor子类工厂,可以通过指定null来表示默认工厂。

前面是第一种创建数据库的方法,接下来第二种是比较常用的创建数据库的方法,该方法通过SQLiteOpenHelper这个数据库辅助类来帮助创建数据库的(个人推荐这个方法),接下来重点介绍该方法;

利用该方法创建数据库,首先要实现SQLiteOpenHelper这个类,即新建一个类来继承它,并实现它的几个必要的方法(onCreate()和onUpgrade())

如:

//新建一个DatabaseHelper类继承SQLiteOpenHelper类
public class DatabaseHelper extends SQLiteOpenHelper{
// 数据表的名字TABLE_NAME
public static String TABLE_NAME = "mycontact";
//数据表的属性列COLUMN
public static String COLUMN1 = "contactname";
public static String COLUMN2 = "contactphone";

// DatabaseHelper的构造函数,参数名依次的含义是,活动上下文(即你的Activity名),数据库名字,游标工厂(一般默认值,null),版本号(为数字)
public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}

// 自己重载DatabaseHelper的构造函数,这里就只需两个参数了,这要看自己是否需要
public DatabaseHelper(Context context, String name){
super(context,name,null,1);
}
// 第一次创建数据库时才执行该函数,当再次打开数据库时不会执行该函数;这里我们利用SQL语句创建了一个名为mycontact的表(注意是表名而非数据库名),该表只有两列,你也可利用SQL语句创建不同的表
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql ="CREATE TABLE "+TABLE_NAME+" ("+COLUMN1+" text not null,"+COLUMN2+" text not null"+");";
//    利用SQLiteDatabase对象的execSQL()方法执行SQL语句进行数据库操作
db.execSQL(sql);
}
//    更新数据库的函数,当版本号version发生变化时调用该函数
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

db.execSQL("drop table if exists "+TABLE_NAME);

onCreate(db);
}
}

Helper类写好了,接下来就可以利用该类来帮助创建数据库了。

String DATABASE_NAME="mydb";

//新建一个Helper对象,利用getApplicationContext()方法直接获得活动上下文,再传入数据库名
DatabaseHelper mOpenHelper = new DatabaseHelper(getApplicationContext(), DATABASE_NAME);
//调用Helper对象的getWritableDatabase方法创建数据库返回db
SQLiteDatabase db = mOpenHelper.getWritableDatabase();

调用mOpenHelper对象的getWritableDatabase()方法便可获得一个可写的数据库对象,同理调用getReadableDatabase()方法可获得一个可读的数据库实例对象,这个要由具体操作决定。

当要关闭一个数据库时调用close()方法即可关闭该数据库。

如:

db.close();

SQLite数据库的操作

好了,我们创建好数据库了,接下来我们对数据库进行基本插入、删除、查询操作

数据插入操作

//实现单条数据插入的方法
public void insertData(String tablename,String str1,String str2){
// 新建一个Helper类
DatabaseHelper mOpenHelper = new DatabaseHelper(getApplicationContext(), DATABASE_NAME);
// 调用Helper类的getWritableDatabase方法创建数据库返回db
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
// 创建一条执行数据插入的sql语句
String sql = "insert into "+tablename+"("+DatabaseHelper.COLUMN1+","+DatabaseHelper.COLUMN2+") values("+"'"+str1+"'"+","+"'"+str2+"'"+");";
try{
// 执行sql语句中的操作
db.execSQL(sql);

db.close();

}catch(SQLException e){
e.printStackTrace();
}
}

这个是自定义的方法,该方法插入一个两列数据,与前面创建的表对应(两列数据),这里用的是execSQL()方法来完成插入操作,第一个参数是表名,第二、第三个参数是插入的第一列和第二列数据项;

这种方法需要自己写一个插入方法,而且对SQL操作语句要有一定了解;接下来利用已封装好的insert()方法进行插入操作,该方法用起来很简单,直接利用创建好的数据库db调用insert()便可实现插入操作;

insert基本语法:public long insert(String table, String nullColumnHack, ContentValues values);

如:db.insert(tablename, null, values);

第一个参数为插入的数据表的名字;第二个参数为空列的默认值,一般设为null;第三个参数为插入的数据值,该数据值为一个ContentValues对象;

前面两个参数都很简单,主要是第三个参数,何为ContentValues对象呢?其实它的原理和Hashtable对象是差不多的,用来存储一些名值对;

ContentValues和insert用法:

static String COLUMN1 = "contactname";
static String COLUMN2 = "contactphone";

static String tablename = "mycontact";

//创建一个ContentValues对象

ContentValues values = new ContentValues();

//往该对象中加入键值对,第一个值是列名,第二个值是插入的数据

values.put(COLUMN1,"hetao");

values.put(COLUMN2,"1372839294");

db.insert(tablename, null, values);

数据删除操作

// 实现单条数据的删除方法
public void deleteData(String tablename,String key,String str){
try{
// 新建一个Helper类
DatabaseHelper mOpenHelper = new DatabaseHelper(getApplicationContext(), DATABASE_NAME);
// 调用Helper类的getWritableDatabase方法创建数据库返回db
SQLiteDatabase db = mOpenHelper.getWritableDatabase();

//              直接调用db的delete方法实现删除操作
db.delete(tablename, key+"="+str, null);
}catch(SQLException e){
e.printStackTrace();
}
}

delete基本语法:public int delete(String table, String whereClause, String[] whereArgs);

delete的第一个参数为数据表的名字;第二个参数为删除条件(相当于SQL语句中的where后面的语句);第三个参数为删除条件值数据。

如果要删除多行不同数据,也可写为:

//要删除数据的列名为contactname

String key = "contactname";

String[] whereArgs = {"hetao","xiaoli","zhangsan"};

//删除列contactname中等于hetao、xiaoli、zhongsan的所有行,这里用'?'替代后面的whereArg内容

db.delete(tablename, key+"=?", whereArg)

数据查询操作

//定义你要查找的哪些列名,这里我们借用前面定义的字符串常量

String[] col = {COLUMN1, COLUMN2} ;

// 实现数据查询的方法
public Cursor showData(String tablename,String[] col){
// 新建一个Helper类
DatabaseHelper mOpenHelper = new DatabaseHelper(getApplicationContext(), DATABASE_NAME);
// 调用Helper类的getReadableDatabase方法打开数据库返回db
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
// 调用db的query方法返回一个cursor对象用于对数据表中的数据进行操作
Cursor cursor =db.query(tablename, col, null, null, null, null, null,null);
return cursor;
}

query方法基本语法:public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);

该方法参数虽多,但可利用SQL的查询语句的基本语法进行记忆。

第一个参数table为数据表名字;

第二个参数columns为查询的数据列(以字符串数组形式);

第三、四个参数selection、selectionArgs与前面delete()的whereClause、whereArgs一样,相当于where后面的语句,可参照delete中的写法,这里表示查询条件;

第五个参数groupBy相当于SQL语句中的groupby后面的语句,表示分组;

第六个参数having相当于SQL语句中的having语句后面的内容,表示分组满足的条件;

第七个参数orderBy相当于SQL语句中的orderby语句后面的内容,表示选择按升序或降序排序;

注意到,该方法返回到是一个Cursor对象,那何为Cursor呢?

Cursor接口是一个查询结果的游标接口,android系统通过该接口提供了很多遍历查询结果的方法,列如,移动指针、获取列值、获取记录的条数等。在程序中通过query方法查询的结果便存放在Cursor接口对象中。我们通过解析Cursor接口对象,便可获取查询结果。

接下来我们来解析query查询的结果:

//      创建一个Cursor对象用来接受查询方法返回的Cursor对象

Cursor cursor = showData(DatabaseHelper.TABLE_NAME, colString);
// 调用cursor的getCount方法获得数据的条目数
int num = cursor.getCount();
// 将游标移动到表中最后一行,以为是从0开始,所以要减一
cursor.moveToPosition(num-1);
// 获得最后一行的第一、第二列的String数据
String str1 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN1));
String str2 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN2));
/* 也可写成:

//      获得第一、第二列的String数据(0和1分别代表第一列和第二列)

String str1 = cursor.getString(0);
String str2 = cursor.getString(1);

*/

除了获取一行的数据外,还可以利用Cursor进行每行的遍历。

如:

// Cursor的两种遍历方法:
// while(cursor.moveToNext())
// {
//       光标移动成功把数据取出

String str1 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN1));
String str2 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN2));

//        接下来是取出数据后的相应操作.......

//}
或者:
//for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext())
//{
////把数据取出

        String str1 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN1));
String str2 = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN2));

//        接下来是取出数据后的相应操作.......
// }

数据更新操作

update方法基本语法 public int update(String table, ContentValues values, String whereClause, String[] whereArgs);

第一个参数为数据表名字,第二个为前面提到的ContentValues对象,用法也一样,第三第四个参数为选择要更新数据满足的条件,用delete中的用法一样,这里不再赘述了。

用法如下:

db.update(tablename, values, "contactname = hetao", null);

我们介绍了SQLite中数据库的建立和几种基本操作(insert、delete、query、update),相信大家对SQLite也有了一定了解,在实际项目中要靠自己灵活运用,很高兴能为大家分享。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值