第五章 SQLite

    xiaoxiao2025-09-03  366

    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(); //创建contentValue contentValues.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语句;

    转载请注明原文地址: https://ju.6miu.com/read-1302279.html
    最新回复(0)