写给初学者25_android_数据持久化_slqlite

来源:互联网 发布:gif制作 知乎 编辑:程序博客网 时间:2024/06/10 16:33

安卓25_数据持久化-SQLite


文件和共享参数的持久化能够帮助我们对一些简单,基本的信息进行一个储存,但是功能也是有局限性的,这个时候就需要数据库了。

安卓系统内置了一个SQLite数据库,一种轻量级的关系型数据库,如果你用过MySQL,或者Oracle这样的关系型数据库就能很快的上手了。对初学者来讲,最难得地方莫过于数据库语句不熟悉,而且系统原生的SQLite操作方式还是挺让人头大的,不过还好的就是有比较多第三方支持库,不过还是建议从基本的了解开始。

基本的一些类

  • SQLiteOpenHelper
  • SQLiteDatabase
  • Cursor
  • ContentValues

SQLiteOpenHelper用于对数据库的创建和更新,以及返回SQLiteDatabase对象,SQLiteDatabase主要负责的是数据库的增删改查操作,ContentValues用于增加和修改时的值操作,Cursor代表着查询结果集。

SQLiteOpenHelper 创建 更新数据库

  1. SQLiteOpenHelper是个抽象类
  2. 参数较多的构造方法
  3. onCreate()创建数据库时回调
  4. onUpgrade()数据库升级回调
  5. 返回SQLiteDatabase的getReadableDatabase()和getWritableDatabase()

继承

public class MySQLiteOpenHelper extends SQLiteOpenHelper {    public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    @Override    public void onCreate(SQLiteDatabase db) {    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

构造摘要

  • context 上下文对象
  • name 数据库名称
  • fcatory 自定义结果集 一般使用默认的就好 传入null
  • version 数据库版本号

onCreate() 创建数据库

一般在这儿执行一些新建表的操作。比如我们在这里新建一张表。

// 创建表的数据库语句public static final String TABLE_PERSON = "create table Person (" +        "id integer primary key autoincrement, " +// id(主键) 整数类型 并且唯一        "name text, " +// name text 代表文本类型        "age integer, " +        "height real" +// 身高 real 代表小数类型        ")";@Overridepublic void onCreate(SQLiteDatabase db) {    // 回调返回SQLiteDatabase 进行数据库创建    db.execSQL(TABLE_PERSON);}

只要对数据库语句有一个基本的了解,这些语句其实很好搞定,如果不太熟悉可以在网上查阅,也给一个SQLite语法网站在这里http://www.runoob.com/sqlite/sqlite-syntax.html

另外我们接下来只需要执行任何的操作,系统就会回调onCreate,比如:

 @Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(this,"DataDemo",null,1);    openHelper.getReadableDatabase();}

直接获取一个Database对象,也会触发回调。

查看数据库文件

  • 数据库文件的存放路径data/data//database/目录下
  • SQLite可视化工具
  • adb工具(初学者可以后面掌握)

1.使用ADM导出数据库文件

2.使用可是话工具查看数据库,我这里使用的是FireFox插件

可以看到我们的数据库已经创建成功。

需要注意的是,之后我们再执行相关操作的时候会发现onCreate不会再调用了,涉及到更新的时候我们再说。

更新数据库

如果我们有新建表,或者对表做了一次全新的升级,这个时候我们就需要回调onUpgrade了,这里很多人会犯一个错误,普遍会去再onCreate当中多执行一次SQL语句,达到创建表,会修改表的目的,但是当数据创建过了以后,数据库是不会再回调onCreate的。这个时候需要我们更改版本,回调我们的onUpgrade方法了。

比如我们这里在原有了的数据库上新建一张数据库表。

// 创建表的数据库语句public static final String TABLE_PERSON = "create table Person (" +        "id integer primary key autoincrement, " +// id(主键) 整数类型 并且唯一        "name text, " +// name text 代表文本类型        "age integer, " +        "height real" +// 身高 real 代表小数类型        ")";// 创建表的数据库语句public static final String TABLE_PET = "create table Pet (" +        "id integer primary key autoincrement, " +        "name text, " +        "age integer, " +        "weight real" +        ")";@Overridepublic void onCreate(SQLiteDatabase db) {    // 回调返回SQLiteDatabase 进行数据库创建    db.execSQL(TABLE_PERSON);    db.execSQL(TABLE_PET);}

这是第一步,接着我们应该在创建SQLiteOpenHelper的时候将版本提升,用来回调到onUpgrade()方法

MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(this,"DataDemo",null,2);// 提升版本号    openHelper.getReadableDatabase();

更重要的是onUpgrade方法当中的实现。这里我们创建表的操作放到了onCreate中,我们可以直接调用,但是我们有过一张表,这个时候再创建就会出错,当然可以先删除后再创建,这么看起来是很鸡肋的。

@Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("drop table if exists Bool");        onCreate(db);// 删除后再执行创建    }

数据库的基本操作-增删改查

增加数据

后面的操作,ContentValues和Corsor将逐渐使用到。大致的方式有两种:

1.insert方法
2.执行数据库插入语句

public void addData(){    SQLiteDataBase db = openHelper.getWritableDatabase();    ContentValues values = new ContentValues();    // 使用values装载数据    values.put("name","xxx");    values.put("age",19);    values.put("height",190.5);    // 执行插入方法    db.insert("Person",null,values);    // 直接使用数据库语句插入数据    db.execSQL("insert into Person(name,age,height) values (?,?,?)"    ,new String[]{"yyy","20","111"});}

相信两种方式对初学者都不会特别喜欢,令人抓狂的是,后面的操作更加让人疯狂。

更新数据

SQLiteDataBase db = openHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("age",29);db.update("Person",values,"name = ?",new String[]{"xxx"});

整段代码的意思是修改name为xxx的年级为29岁。下面是直接使用数据库语句的:

db.execSQL("update Person set age = ? where name = ? , new String[]{"29" , "xxx"}");

删除数据

SQLiteDataBase db = openHelper.getWritableDatabase();db.delete("Person","age > ?",new String[]{"15"});// 删除年纪大于15岁的人db.execSQL("delete from Person where age > ?",new String[]{"15"});

查询数据

掉用的方法是query,返回的是Cursor结果集。关键是query方法的参数有点多,初学者不太好理解。

先看最简单的查询所有

SQLiteDataBase db = openHelper.getWritableDatabase();// 得到返回结果集 这里是查询所有Cursor cursor = db.query("Person",null,null,null,null,null,null,);// 游标来到第一个if(cursor.moveToFirst()){    do{        // 进行取值        String name = cursor.getString(cursor.getColumnIndex("name"));        int age = cursor.getString(cursor.getColumnIndex("age"));        float height = cursor.getString(cursor.getColumnIndex("height"));    }while(cursor.moveToNext());// 如果有下一个就一直取}cursor.close();// 关闭游标

可以看到就传递一长串的null,如果我们需要做精准一些的查询,这个时候这些参数就会派上用场了。你只需要根据参数类型和参数用途传递合适的值就Ok了。

基本的数据库操作要会,最好能熟练数据库语句

0 0