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

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数据库的时候需要谨慎。有条件的话,可以去更深入的学习一下数据库在实际开发中的使用技术。这样也可以有助于提升自己的技术水平。


你可能感兴趣的:(Android)