Android App开发基础篇—数据存储(SQLite数据库)

来源:互联网 发布:nginx 允许访问目录 编辑:程序博客网 时间:2024/05/22 01:57

Android App开发基础篇—数据存储(SQLite数据库)

    前言:Android中提供了对SQLite数据库的支持。开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作。

一、创建SQLite数据库

    要在应用中使用SQLite数据库,可以通过创建一个继承SQLiteOpenHelper类的辅助类,然后重写onCreate()方法,例如:

package com.test.testapplication;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by linyingkun on 2017/3/3. */public class DBHelper extends SQLiteOpenHelper {    private Context mContext;    //直接指定数据库名称、版本号。也可以使用默认生成的,    //带有数据库名、数据库版本号等参数的构造方法,然后    //在获取辅助类对象的时候再动态指定名称和版本号。    public DBHelper(Context context) {        super(context, "testdb", null, 1);        mContext = context;    }    //onCreate()方法里面执行SQL语句,如建表    //如果数据库和表都已存在,则该方法不会再执行    @Override    public void onCreate(SQLiteDatabase db) {        String create_table = "CREATE TABLE students(id INTEGER PRIMARY KEY AUTOINCREMENT," +                "name VARCHAR(20),age VARCHAR(20));";        db.execSQL(create_table);    }    //当数据库版本发生变化时,该方法被调用    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

二、创建数据库并对数据进行操作

    2.1 创建数据库

    完成步骤一后,在应用中需要使用数据库的地方,先获得一个辅助类对象,然后调用getReadableDatabase()或者getWriteableDatabase()方法创建数据库对象。通过此步骤,如果系统中不存在同名数据库,则将在系统的/data/data/包名/databases目录下创建一个辅助类中指定名称的数据库,同时onCreate()方法会被调用。但是,如果系统中已存在同名数据库,则onCreate()方法不会再被调用,只有当数据版本发生变化时,onUpgrade()方法会被调用。

DBHelper dbHelper = new DBHelper(this);SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();

    2.2 对数据库中数据的操作

    要对数据库中的数据进行操作,可以直接使用数据库对象执行对应的SQL语句,也可以通过ORM(对象关系映射)的方法。下面一起来看示例:

    2.2.1 增

    普通方法:

//在数据库表中插入数据的SQL语句,格式为//insert into 表名 (字段1,字段2,...) values ("数据1","数据2",...)//注意字段和数据要一一对应。String insert = "INSERT INTO students (name,age) VALUES ('s1','20')";//通过数据库对象调用execSQL()方法执行SQL语句writableDatabase.execSQL(sql);

    ORM方法:

//获取ContentValues对象ContentValues contentValues = new ContentValues();//ContentValues对象插入想要插入数据库表的数据contentValues.put("name", "s2");contentValues.put("age", "21");//使用数据库对象调用insert()方法将Contentvalues对象插入对应的表中writableDatabase.insert("students", null, contentValues);

    2.2.2 查

    普通方法

//SQL查询语句,格式为//select 字段名(*号表示查询所有字段) from 表名 where 条件(name="s1",省略条件则查询所有数据)String query = "SELECT * FROM students";//使用数据库对象的rawQuery()方法执行查询语句,返回一个Cursor对象//参数1:要执行的SQL语句//参数2:用于指定了查询条件,如没有条件则使用null。比如,查询语句//SELECT * FROM students WHERE name="s1",可写成//SELECT * FROM students WHERE name=?,然后在参数2的位置,通过new String[]{"s1"}指定条件。Cursor cursor = writableDatabase.rawQuery(query, null);//cursor移动到第一位boolean b = cursor.moveToFirst();//如果btrue,表示有数据存在while (b) {    //根据字段名获取该字段对应的下标index    int nameIndex = cursor.getColumnIndex("name");    int ageIndex = cursor.getColumnIndex("age");    //根据字段下标获得对应的数据    String name = cursor.getString(nameIndex);    String age = cursor.getString(ageIndex);    //cursor往下移动一位    b = cursor.moveToNext();

    ORM方法:

//使用数据库对象的query()方法执行查询,其中各参数分别代表//参数1:要查询的数据库表的表名//参数2:要查询的字段,String数组。如new String[]{"name","age"},//参数3:查询条件。String字符串,如name//参数4:条件语句占位符的填充,String数组。//参数5:分组语句//参数6:分组语句占位符的填充//参数7:排序//以上参数除了表名必须指定,其他的若无指定,都可以使用null。Cursor cursor = writableDatabase.query("students", new String[]{"name", "age"},        "name=?", new String[]{"s1"}, null, null, null);boolean b = cursor.moveToFirst();while (b) {    int nameIndex = cursor.getColumnIndex("name");    int ageIndex = cursor.getColumnIndex("age");    String name = cursor.getString(nameIndex);    String age = cursor.getString(ageIndex);    b = cursor.moveToNext();    Log.e("MainActivity", name + ":" + age);}

    2.2.3 删

    普通方法

//删除数据的SQL语句,格式为//delete from 表名 where 条件String delete = "DELETE FROM students WHERE name=?";//使用数据库对象调用execSQL()方法执行SQL语句。//参数1:要执行的SQL语句//参数2:指定条件。可以直接写在SQL语句中,也可以像这里一样,//在语句中用 ?占位符替代具体条件,然后在参数2中再指定。//注:如果不指定条件,则SQL语句为 DELETE FROM students//调用执行语句的方法为 writableDatabase.execSQL(delete);//此时整张表的数据都会被删除。writableDatabase.execSQL(delete, new String[]{"s1"});

    ORM方法:

//使用数据库对象调用delete()方法。各参数分别表示//参数1:表名//参数2:条件语句//参数3:条件占位符填充writableDatabase.delete("students","name=?",new String[]{"s1"});

    2.2.4 改

    普通方法:

//修改数据的SQL语句,格式为//update 表名 set 字段1="数据",字段2="数据",... where 条件String update = "UPDATE students SET name=?,age=? WHERE id=?";//使用数据库对象调用execSQL()方法。writableDatabase.execSQL(update,new String[]{"1","10","1"});

    ORM方法:

//获取ContentValues对象ContentValues values =newContentValues();//ContentValues对象插入要用于修改的数据values.put("name","2");values.put("age","25");//使用数据库对象调用update()方法,各参数代表//参数1:表名//参数2:数据//参数3:条件语句//参数4:条件占位符填充writableDatabase.update("students",values,"id=?",newString[]{"26"});

    后记:本篇简单记述了Android中SQLite数据库的使用方法。一般情况下,如果数据量不大,在代码中直接使用上述的方法不会出现什么问题。但是如果数据量很大,就有可能造成ANR或者程序崩溃。所以在使用SQLite数据库的时候需要谨慎。有条件的话,可以去更深入的学习一下数据库在实际开发中的使用技术。这样也可以有助于提升自己的技术水平。


0 0