第五章 SQLite

来源:互联网 发布:淘宝网严重违规b48分 编辑:程序博客网 时间:2024/05/16 12:24

SQLite的使用

SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百的内存就足够了,因而特别适合在移动设备上使用。

1.1 创建数据库

为了方便的管理数据库,专门有一个SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。
SQLiteOpenHelper 是一个抽象类,这就要求我们去创建一个对自己有帮助的类去继承它。通过重写onCreate()和onUpdate()两个抽象方法,去实现创建和升级数据库的逻辑。
如要在数据库中创建一个book表,其中有书名、作者、价格三列,重写onCreate方法如下:
public void onCreate(SQLiteDatabase db) {        db.execSQL("create table book(name,author,price)");}
然后在MAinActivity中添加代码:
DatabaseHelper databaseHelper = new DatabaseHelper(this,"BookStore.db",null,1);mSQLiteDatabase = databaseHelper.getWritableDatabase();

1.2 升级数据库

重写onUpdate方法,如要在数据库中添加一个表Category ,包括分类名和分类码两列,代码如下:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);}
重写onCreate方法:
public void onCreate(SQLiteDatabase db) {        db.execSQL("create table book(name,author,price)");db.execSQL("create table Category(name,code)");}
上面在DatabaseHelper中先删除数据,在重新加载数据;
重写方法后,我们要考虑的是如何执行onUpdate方法,我们在MAinActivity中添加如下代码:
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);mSQLiteDatabase = databaseHelper.getWritableDatabase();

当版本号改变,调用onUpdate方法。
注:这不是最好的更新数据库的方法,因为用户升级后会造成以前的数据丢失。最优方法见《第一行代码》第六章。

1.3 添加数据

这里要使用contentValues,它是一个键值对,对来承载数据的,添加数据如下:
ContentValues contentValues = new ContentValues();                         //创建contentValuecontentValues.put(DatabaseHelper.USERNAME,"Tom");contentValues.put(DatabaseHelper.AGE,"123");mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues);   //插入第一条数据contentValues.clear();                                                   //清空contentValue数据,重新添加数据contentValues.put(DatabaseHelper.USERNAME,"Jack");contentValues.put(DatabaseHelper.AGE,"456");mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues);   //插入第二个数据
上面的代码中,首先创建一个contentValue,在里面放置要添加的数据,然后用insert()方法把contentValue添加到应对的表中。
注意:当添加完一条数据后,要清空contentValue再在这个contentValue中重新加载新数据;而不是再创建一个新的contentValue1 用来添加第二条。

1.4 更新数据

更新数据使用update()方法,代码示例如下:
db.update("Book",contentValue,"name=?",new String[]{"The Dream of Red Mansion"});
上面第三个参数中“?”是一个占位符,第四个参数提供了占位符指定的相应内容,这里表示更新name=The Dream of Red Mansion的行。

1.5 删除数据

删除数据使用delete()方法,它和更新数据的代码非常相似,代码示例如下:
db.delete("Book","price>?",new String[]{"500"});

1.6查询数据

数据库SQL的全称是Structured Query Language(结构化查询语言),所以查询功能是其核心。
查询使用qury()方法,它有七个参数:

第一个参数不用说,当然还是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参数用于指定需要去 group by 的列,不指定则表示不对查询结果进行 group by 操作。第六个参数用于对 group by 之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。

Cursor cursor =  mSqLiteDatabase.query(DatabaseHelper.DATABASE_NAME,null,null,null,null,null,null);if (cursor.moveToFirst()){   int count = cursor.getCount();   for (int i = 0; i < count; i++) {   String userName = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.USERNAME));   String age = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.AGE));   Log.i(MainActivity.class.getSimpleName(),i+":"+userName+"|"+age);   }}
上面是最简单的一种查询功能,首先使用query()方法表示希望查询这张表中的数据;接着调用moveToFirst()方法将数据的指针移动到第一行位置,然后进入一个循环,去遍历查询到的每一行数据。

1.7 使用SQL语言操作数据

前面讲的是利用Android中的DatabaseHelper提供的API对数据库进行操作,我们也可以直接使用SQL语言进行操作。例如删除数据的代码:

<pre name="code" class="java">db.execSQL("delete from Book where price>?",new String[]{"20"});

添加数据的代码:

db.execSQL("insert into Book (name, autho, price) values(?, ?, ?, ?)",new String[] { "The Da Vinci Code", "Dan Brown", "16.96" });
查询数据的代码:

db.rawQuery("select * from Book", null);
可以看到,查了查询数据的时候调用的是SQLiteDatabase的rawQuery()方法,其他的操作都是调用execSQL()方法。

1.8 使用事务

SQLite 数据库是支持事务的,事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。那我们为什么要使用事务呢?

考虑这种情况,比如你正在进行一次转账操作,银行会将转账的金额先从你的账户扣除,然后再向收款方的账户添加等量的金额。可是,如果当你的账户中的金额刚刚被扣除,这时由于一些原因导致对方收款失败,那这一笔钱就凭空消失了。这时我们可以使用事务这种技术,保证扣钱和收款要么一起成功,要么一起失败。

<span style="white-space:pre"></span>mSqLiteDatabase.beginTransaction();    //开启事务        try {            mSqLiteDatabase.delete(DatabaseHelper.DATABASE_NAME,null,null);               if (true){                //这里手动抛出一个异常,让事务失败                throw new NullPointerException();            }            ContentValues contentValues = new ContentValues();            contentValues.put(DatabaseHelper.USERNAME,"Frank");            contentValues.put(DatabaseHelper.AGE,"10岁");            mSqLiteDatabase.insert(DatabaseHelper.DATABASE_NAME,null,contentValues);       //删除操作和添加操作同时成功或失败            mSqLiteDatabase.setTransactionSuccessful();               // 事务已经执行成功        }catch (Exception e){            e.printStackTrace();        }finally {            mSqLiteDatabase.endTransaction();                         //结束事务        }

总结:对于三种数据持久化的方法,文件适用于存储一些简单的文本数据或者二进制数据,SharePreferences适用于存储一些键值对,而数据库适合存储那些复杂的关系型数据。


拾遗:

1、快捷键Ctrl+Shift+A弹出对话框中可以输入要执行的操作的名字,可快速执行操作;

2、用上述快捷键输入ADB Clear清除这个工程在手机中的数据,和安卓系统中setting工具的清除工具是一样的效果;

3、原始的SQL语句执行效率更高,如rawQuery、execSQL语句;

1 0
原创粉丝点击